代码随想录day08 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字
344. 反转字符串
简单题
class Solution {
public:
void swap(vector<char>& s, int i, int j) {
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
void reverseString(vector<char>& s) {
size_t left = 0;
size_t right = s.size() - 1;
while (left < right) {
swap(s, left, right);
left++;
right--;
}
}
};
541. 反转字符串 II
我自己的想法设置一个标志位flag,每步走k个单位,flag为true则代表走之前要反转,否则不需要
class Solution {
public:
void reversePart(string &s, int i, int j) {
for (int left = i, right = j; left < right; left++,right--) {
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
}
}
string reverseStr(string s, int k) {
int idx = 0;
bool flag = true;
int len = s.size();
while (true)
{
if (idx + k >= len) {
if (flag) {
reversePart(s, idx, len - 1);
}
return s;
}
if (flag) {
reversePart(s, idx, idx + k - 1);
flag = false;
} else {
flag = true;
}
idx += k;
}
}
};
卡哥的就简单多了 直接走2k个单位 看前面k个是否符合,但我感觉一些细节比如if i+k是小于等于还是小于size,i是小于size呢还是小于等于需要拿一些例子去考量
class Solution {
public:
string reverseStr(string s, int k) {
for (int i = 0; i < s.size(); i += (2 * k)) {
// 1. 每隔 2k 个字符的前 k 个字符进行反转
// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
if (i + k <= s.size()) {
reverse(s.begin() + i, s.begin() + i + k );
} else {
// 3. 剩余字符少于 k 个,则将剩余字符全部反转。
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
54. 替换数字
第一次感受acm模式,我的是定义了一个新的string,但卡哥重新resize了,性能要更好些
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main() {
string str;
cin >> str;
string res;
for (auto & ele : str) {
if (isdigit(ele)) {
res += "number";
} else {
res += ele;
}
}
cout << res;
return 0;
}
// 卡哥的
#include <iostream>
using namespace std;
int main() {
string s;
while (cin >> s) {
int sOldIndex = s.size() - 1;
int count = 0; // 统计数字的个数
for (int i = 0; i < s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9') {
count++;
}
}
// 扩充字符串s的大小,也就是将每个数字替换成"number"之后的大小
s.resize(s.size() + count * 5);
int sNewIndex = s.size() - 1;
// 从后往前将数字替换为"number"
while (sOldIndex >= 0) {
if (s[sOldIndex] >= '0' && s[sOldIndex] <= '9') {
s[sNewIndex--] = 'r';
s[sNewIndex--] = 'e';
s[sNewIndex--] = 'b';
s[sNewIndex--] = 'm';
s[sNewIndex--] = 'u';
s[sNewIndex--] = 'n';
} else {
s[sNewIndex--] = s[sOldIndex];
}
sOldIndex--;
}
cout << s << endl;
}
}