翻转单词顺序(左旋转字符串)
题目
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student. a am I"。
思路
- 翻转句子中所有的字符。比如翻转"I am a student."中所有的字符得到".tneduts a ma I",此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转了。
- 再翻转每个单词中字符的顺序,就得到了"student.a am I"。这正是符合题目要求的输出。
string reverseWords(string s) { if (s.empty()) { return s; } int i = 0, j = s.size() - 1; while (i < j) { swap(s[i], s[j]); ++i; --j; } i = 0; int index = 0; while (i < s.size()) { while (s[i] == ' ') { ++i; } j = i; while (j <= s.size() && s[j] != ' ') { ++j; } index = j; --j; while (i < j) { swap(s[i], s[j]); ++i; --j; } i = index; } return s; }
左旋转字符串
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
class Solution { public: string LeftRotateString(string str, int n) { if(str.empty()||n<0) return ""; n%=str.size(); reverse(str.begin(),str.end()); reverse(str.begin(),str.begin()+str.size()-n); reverse(str.begin()+str.size()-n,str.end()); return str; } };