1,问题:
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
2,想法:
看例子后,想到反转,先反转左边部分得到,cbaXYZdef,再旋转右边部分,得到cbafedZYX,然后再全部旋转得到XYZdefabc.所以只要三次旋转即可。
3,编码:
class Solution {
public:
void reverseString(string &str,int start, int end)//传进去的参数必须为引用
{
if (str == "")
{
return;
}
if (start == end)
{
return;
}
int a = start;
int b = end;
int temp;
while (a < b)
{
temp = str[a];
str[a] = str[b];
str[b] = temp;
a++;
b--;
}
}
string LeftRotateString(string str, int n) {
if (str == "")
{
return str;
}
if (n > str.size())
{
n = n - str.size();
}
reverseString(str, 0, n - 1);//先部分旋转左边
reverseString(str, n, str.size() - 1);//部分旋转右边
reverseString(str, 0, str.size() - 1);//全部旋转一次
return str;
}
};