题目:
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
思路:
举个例子比较好说明这个问题,S=“abcXYZdef”左旋3位的结果为“XYZdefabc”。我们可以借助先部分逆序,最后整体逆序来得到左旋的结果。
逆序[0, n-1],得到cbaXYZdef
逆序[n, length-1],得到cbafedZYX
逆序[0, length-1],得到XYZdefabc
扩展:假设这道题让我们求右旋n位之后的结果,S=“abcXYZdef”右旋3位的结果为“defabcXYZ”.
逆序[0, length-n-1],得到ZYXcbadef
逆序[length-n, length-1],得到ZYXcbafed
逆序[0, length-1],得到defabcXYZ
class Solution {
public:
string LeftRotateString(string str, int n) {
if(str.empty() || n<0)
return "";
if(n==0)
return str;
Rerverse(str, 0, n-1);
Rerverse(str, n, str.size()-1);
Rerverse(str, 0, str.size()-1);
return str;
}
void Rerverse(string& s, int left, int right){
char c;
while(left < right){
int tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
};