题目
对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。
思路
- 如果字符串S为空,或者循环左移的位数n为0,则直接返回S。
- 对于左移数字n,如果大于S的话,至少会完整的左移一圈使得S又变成了原样。所以可以先模一下S的长度。
- 思路一
- 新建一个string 变量res。
- 对于n,把S分为两部分,0~n-1, n~S.size()-1。
- 先将后半部分复制给str,再将前半部分接到res上。
- 思路二
- 不用额外的空间,只能在原字符串上操作。
- 可以先将整个字符串翻转,然后把两部分分别翻转,如下图。
代码一
class Solution {
public:
string LeftRotateString(string str, int n) {
if ( str.size() == 0 || n == 0 )
return str;
n = n % str.size();
string res = str.substr( n, str.size()-n+1 );
res += str.substr( 0, n );
return res;
}
};
代码二
class Solution {
public:
string LeftRotateString(string str, int n) {
if ( str.size() == 0 || n == 0 )
return str;
n = n % str.size();
swap( str, 0, str.size()-1 );
swap( str, 0, str.size()-1-n );
swap( str, str.size()-n, str.size()-1 );
return str;
}
void swap( string& str, int left, int right ) {
while ( left < right ) {
char temp = str[left];
str[left] = str[right];
str[right] = temp;
++left;
--right;
}
return;
}
};