151.翻转字符串里的单词 方法很巧妙,进行了两次反转。其中细节太多了。 1.如何处理首个单词前面的空格,以及后面单词之间的空格处理(最重要的部分)。 2.单词反转时的下标。
class Solution {
public:
void reverse(string &s,int left,int right){
for(int i=left,j=right;i<j;i++,j--){
swap(s[i],s[j]);
}
}
string reverseWords(string s) {
int count=0;
for(int i=0;i<s.size();i++){
if(s[i]!=' '){
if(count!=0)
s[count++] =' ';
//后面相邻单词间加上空格
while(i<s.size()&&s[i]!=' '){
s[count++]=s[i++];
}
}
}
s.resize(count);
reverse(s,0,s.size()-1);
int res = 0;
for(int i=0;i<=s.size();++i){
if(i == s.size() || s[i] ==' '){
reverse(s,res,i-1);
res=i+1;
}
}
return s;
}
};
卡码网 55.右旋转字符串
这种方法看起来不太聪明,可以采用反转的方法。先将所有的字符串反转,再将前k个和后k个分别反转就可以得到结果。
string res(s.size(), ' ');创建一个长度为s.size()的字符串,初始化为全空格。这步需要记一下。
#include<iostream>
using namespace std;
int main(){
string s;
int a=0;
cin>>a;
cin>>s;
string res(s.size(), ' ');// 创建一个长度为s.size()的字符串,初始化为全空格
int num=0;
for(int i=s.size()-a;i<s.size();i++){
res[num++]=s[i];
}
for(int i=0;i<s.size()-a;i++){
res[num++]=s[i];
}
cout<<res<<endl;
return 0;
}
标签:151,卡码,string,int,反转,单词,字符串,size
From: https://blog.csdn.net/m0_69189584/article/details/139687707