版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nwpubear/article/details/81748606
翻转字符串
翻转一个字符串中的单词顺序,只需要
1. 翻转字符串
2. 翻转单词
class Solution {//左旋转某个有序的东西,只需要先反转整体,让内部元素整体归位,然后在局部反转,让内部元素的每个元素归位
public:
string ReverseSentence(string str) {
int begin=0;
int end=0;
int len=str.size();
//反转整个句子
ReverseWord(str,0,str.size()-1);
//反转其中的单个单词
//每个单词之间都是空格隔开
begin=0;
end=0;
//没有遇到单词的时候两个指针一起运动
//核心是一个指向单词头部,一个遍历单词直到遇到空白或者句子的末尾,
while(end<=len-1){
if(str[begin]==' '){ //首先找到不是单词的头部
begin++;
end++;
}
else if(str[end]==' '){ //遇到了一个单词的末尾
ReverseWord(str,begin,end-1);
begin=end;
}
else if(end==len-1){ //到了句子的末尾
ReverseWord(str,begin,end);
break;
}
else{ //在单词上面
end++;
}
}
return str;
}
private:
static void ReverseWord(string & str,int begin,int end){
reverse(str.begin()+begin,str.begin()+end+1);
}
};
左旋转字符串
其实左旋转只是这个的一个扩展,把前半部分看成一个局部整体,后半部分看成局部整体
1. 翻转字符串
2. 翻转两个局部
class Solution { //左旋转字符串,需要注意求余数的时候先考虑长度为0,避免出现数学错误
public:
string LeftRotateString(string str, int n) {
if(str.size()==0 || (n=n%str.size())==0)
return str;
reverse(str.begin(),str.end());
reverse(str.begin(),str.end()-n);
reverse(str.end()-n,str.end());
return str;
}
};