【问题】汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。
【思路】STL中substr的用法!注意参数n有可能大于整个字符串的长度,所以要进行取余操作!
class Solution { public: string LeftRotateString(string str, int n) { int len = str.length(); if(len == 0) return ""; n %= len; str += str; return str.substr(n, len); } };
另外一种方法就是不使用库函数的!对字符串进行三次的翻转,首先是0到n-1,再者是n到len-1,最后是0到len-1.
class Solution { public: string LeftRotateString(string str, int n) { int len = str.length(); if(len == 0 || n == 0) return str; reverse(str, 0, n-1); reverse(str, n, len-1); reverse(str, 0, len-1); return str; } private: void reverse(string& s, int begin, int end){ while(begin < end){ swap(s[begin++], s[end--]); } } };