344.反转字符串
用双指针法(今天脑子疼,思路简写)
代码如下:
class Solution {
public:
void reverseString(vector<char>& s) {
for(int i=0,j=s.size()-1;i<s.size()/2;i++,j--){
swap(s[i],s[j]);
}
}
};
541. 反转字符串II
思路:i 每次移动 2 * k,判断是否有反转的空间。
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.替换数字
从后向前扩充
代码如下
#include<iostream>
using namespace std;
int main() {
string s;
while (cin >> s) {
int length = s.size();
int count = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] >='0' && s[i] <='9')
count++;
}
s.resize(s.size() + count * 5);
int newlength = s.size();
for (int i = newlength - 1, j = length - 1; j < i; j--, i--) {
if (s[j]>= '0' && s[j] <='9') {
s[i] = 'r';
s[i - 1] = 'e';
s[i - 2] = 'b';
s[i - 3] = 'm';
s[i - 4] = 'u';
s[i - 5] = 'n';
i -= 5;
} else {
s[i] = s[j];
}
}
std::cout << s << std::endl;
}
return 0;
}
151.翻转字符串里的单词
空间复杂度O(1)的解法:1.先移除多余的空格 2.将整个字符串反转 3.将每个单词反转
代码如下
class Solution {
public:
void reverse(string& s,int start ,int end){
for(int i=start,j=end;i<j;i++,j--){
swap(s[i],s[j]);
}
}
void removekongge(string&s){
int slow=0;
for(int i=0;i<s.size();++i){
if(s[i]!=' '){
if(slow!=0)
s[slow++]=' ';
while(i<s.size()&&s[i]!=' ')
s[slow++]=s[i++];
}
}
s.resize(slow);
}
string reverseWords(string s) {
removekongge(s);
reverse(s,0,s.size()-1);
int start=0;
for(int i=0;i<=s.size();++i){
if(i==s.size()||s[i]==' '){
reverse(s,start,i-1);
start=i+1;
}
}
return s;
}
};
卡码网:55.右旋转字符串
两种思路,先整体反转在局部反转,或者先局部反转在整体反转
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
string s;
int n;
cin>>n>>s;
int length=s.size();
reverse(s.begin(),s.end());
reverse(s.begin(),s.begin()+n);
reverse(s.begin()+n,s.end());
cout<<s<<endl;
}
总结
双指针太好用了!