代码随想录算法训练营第八天 | 344.反转字符串 替换数字
344.反转字符串
- 时间复杂度 o(n)
- 空间复杂度 o(1)
思路:双指针解决,和翻转数组一样
class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0, right = s.size() - 1;
while(left < right) {
char ch = s[left];
s[left] = s[right];
s[right] = ch;
++left, --right;
}
}
};
541.反转字符串II
这道题我是直接开始快慢指针遍历,然后每次判断和k的关系,陷入到了复杂的判断逻辑中。
其实这道题只需要将i每次增加2k个就好了,因为忽略了string的随机访问特性,所以解题思路就狭隘了(应该在熟悉下stl)的常用方法
class Solution {
public:
string reverseStr(string s, int k) {
for(int i = 0; i < s.size(); i += 2 * k) {
if(i + k < s.size()) {
reverse(s.begin() + i, s.begin() + k + i);
} else {
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
卡玛网54.替换数字
tips: 这种替换某些字符的问题都可以扩容之后从后向前遍历
- 时间复杂度 o(n)
- 空间复杂度 o(1)
#include <iostream>
using namespace std;
int main() {
string s;
while(cin >> s){
int length = s.size() - 1;
int count = 0;
for(char ch : s) {
if(ch >= '0' && ch <= '9') ++count;
}
s.resize(length + count * 5 + 1);
int size = s.size() - 1;
while(length >= 0){
if(s[length] <= '9' && s[length] >= '0') {
s[size--] = 'r';
s[size--] = 'e';
s[size--] = 'b';
s[size--] = 'm';
s[size--] = 'u';
s[size--] = 'n';
}else {
s[size--] = s[length];
}
length--;
}
cout << s << endl;
}
return 0;
}
反转字符串
tips:在做反转问题时,要有整体思想(整体反转+局部反转)
- 时间复杂度 o(n);
- 空间复杂度 o(1)
class Solution {
public:
string reverseWords(string s) {
// 去除多余的空格
int fast = 0, slow = 0;
while(fast < s.size()) {
while(s[fast] == ' ' && fast < s.size()) ++fast;
if(slow != 0 && fast < s.size()) s[slow++] = ' ';
while(s[fast] != ' ' && fast < s.size()) {
s[slow++] = s[fast++];
}
}
// 更新字符串长度
s.resize(slow);
// 整体反转
reverse(s.begin(), s.end());
// 局部反转
for(slow = 0, fast = 0; fast < s.size(); fast++) {
while(s[fast] != ' ' && fast < s.size()) ++fast;
reverse(s.begin() + slow, s.begin() + fast);
slow = fast + 1;
}
return s;
}
};
思路:在上一题我们学到了整体思想,这一题直接三次reverse秒掉
- 时间复杂度 o(n)
- 空间复杂度 o(1)
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int k;
cin >> k;
string s;
cin >> s;
reverse(s.begin(), s.end());
reverse(s.begin(), s.begin() + k);
reverse(s.begin() + k, s.end());
cout << s;
return 0;
}