代码随想录算法训练营第八天 | 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;
}
分类:
代码随想录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!