151.翻转字符串里的单词
把复杂问题拆分成简单问题的能力比较薄弱。比如这个问题中:
删除空格 =》删除字符串中的元素并且添加
调转单词=》先把整串字符串倒转,再分别倒转正每个单词
class Solution {
public:string reverseWords(string s) {// 移除空格 跟移除元素操作一样int slow=0;for(int fast=0;fast<s.size();fast++){if(s[fast]!=' '){if(slow!=0) s[slow++]=' '; //增加空格while(fast<s.size()&&s[fast]!=' '){ //单词直接copys[slow++]=s[fast++];}}}s.resize(slow);//反转整个字符串for(int i=0,j=s.size()-1;i<j;i++,j--){swap(s[i],s[j]);}//把单词转正int i=0,j=0;while(i<s.size()&&j<s.size()){while(j<s.size()&&s[j]!=' ') {j++;}for(int m=i,n=j-1;m<n;m++,n--){swap(s[m],s[n]);}i=j+1;j=i;}return s;}
};
删除空格这里有点没有看懂,晕晕的。
卡码网:55.右旋转字符串
字符串转来转去就都是反转字符串的延申。
这个的思路就是先整个字符串反转,再分别反转前后两个子串。
#include <iostream>
#include <string>
using namespace std;int main(){string s;int k;cin >> k;cin >> s;for(int i=0,j=s.size()-1;i<j;i++,j--){swap(s[i],s[j]);}for(int i=0,j=k-1;i<j;i++,j--){swap(s[i],s[j]);}for(int i=k,j=s.size()-1;i<j;i++,j--){swap(s[i],s[j]);}cout << s;
}