题目一
输入英文句子,翻转句子中单词的顺序,但单词内字符顺序不变,标点当作普通字母处理。
如I am a student. 输出student a am i
思路
第一步翻转整个句子,.tneduts a ma I
第二次翻转每个单词,student. a am I
(代码用了reverse函数,也可以自己写)
若用库函数,需要注意,迭代器的区间表示是前闭后开,[first, last),也就是[first, last-1]
class Solution { public:string ReverseSentence(string str) {reverse(str.begin(),str.end());int front=0;int back=0;int size = str.size();while(front < size){while(front < size && str[front] == ' ')++front;back=front;while(back < size && str[back] != ' ')++back;reverse(str.begin() + front, str.begin() + back);front = back;}return str;} };
下面是重写ReverseCore,思路一样
class Solution { public:string ReverseSentence(string str) {int front=0;int back=0;int size = str.size();ReverseCore(str,0, size - 1);while(front < size){while(front < size && str[front] == ' ')++front;back=front;while(back < size && str[back] != ' ')++back;ReverseCore(str, front, back - 1);front = back;}return str;}void ReverseCore(string& str, int begin, int end){if (begin > end)return;while (begin < end)swap(str[begin++], str[end--]);} };
题目二
字符串的左旋操作是把字符串前面若干个字符转移到字符串尾部。如 abcdefg和数字2,输出 cdefgab
思路
借助上题思路,可以理解为 ab cdefg 然后按上述翻转字符串。
思想完全一样,先翻转整个,然后局部翻转。
class Solution { public:string LeftRotateString(string str, int n) {int len = str.size();if (len == 0 || n > len)return "";reverse(str.begin(), str.end());reverse(str.begin(), str.begin() + len - n);reverse(str.begin() + len - n, str.end());return str;} };