151
class Solution {
public:
string reverseWords(string s) {
//先整体翻转,再以单词为单位翻转,这两步也可以颠倒,是等价,这里是颠倒
int k=0;
for(int i = 0; i < s.size(); i ++ ){
if(s[i] == ' ') continue;//每个单词前面的空格都先跳过
int j=i,t=k;
while(j < s.size() && s[j] != ' ') s[t ++ ] = s[j ++ ];
reverse(s.begin() + k, s.begin() + t);//翻转单词
s[t++]=' ';//单词后面添加空格
k=t,i=j;//下一个单词的开头下标
}
if (k) k --;//最后一个空格删掉
s.erase(s.begin()+k,s.end());//将k之后的都删掉
reverse(s.begin(),s.end());
return s;
}
};
541
class Solution {
public:
string reverseStr(string s, int k) {
for(int i=0;i<s.size();i+=2*k){
//最后如果剩余的数不足k个,那么i+k会大于s.size()
int l=i,r=min(i+k,(int)s.size());//s.size()返回的是无符号数,调用 min(),进行比较时需要转换为有符号数
reverse(s.begin()+l,s.begin()+r);//reverse(s.begin(), s.end()), 即reverse [begin, end)
}
return s;
}
};
344
class Solution {
public:
void reverseString(vector<char>& s) {
//双指针,一个在前一个在后,交换,各往前走一步
for(int i = 0, j = s.size() - 1; i<j; i ++, j --)
swap(s[i],s[j]);
}
};
卡码网54
从后向前替换数字字符,也就是双指针法
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
int count=0;
int OldCount=s.size();
for(int i=0;i<OldCount;i++)
if(s[i]<='9'&&s[i]>='0') count++;//计算有几个数组
s.resize(s.size()+5*count);//更新s的长度
int NewCount=s.size();
for(int i=OldCount-1,j=NewCount-1;i>=0&&j>=0;i--,j--){
if(s[i]<'0'||s[i]>'9') s[j]=s[i];
else{
s[j]='r';
s[j-1]='e';
s[j-2]='b';
s[j-3]='m';
s[j-4]='u';
s[j-5]='n';
j-=5;
}
}
cout<<s;
}
55
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
int n;
cin>>n>>s;
reverse(s.begin(),s.end());
reverse(s.begin(),s.begin()+n);
reverse(s.begin()+n,s.end());
cout<<s;
return 0;
}