题目:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
思路:首先需要将位数n与字符串的长度进行比较,如果比字符串的长度大,就需要一个循环不断-len,直到n<len,但这也可以通过取余的方法来确定,n = n%len;接下来就是对字符串的处理了:①我的第一想法是可以新建一个字符串string result,将原字符串n~len-1位的字符依次存到新的字符串的0~len-n-1位,然后再将0~n-1位一次存到新的字符串的len-n~len-1位,但这样做的函数复杂度极高,时间复杂度大概是O(n^2),因为需要循环套循环。②原理:YX = (XTY T)T (直通BAT视频中讲到过的方法),使用swap函数对需要操作的元素进行交换。以题目中的字符串S=”abcXYZdef”为例,当n=3时,可以把S分为:X={abc},Y={XYZdef},进行交换的时候,第一个swap实现对X的转置,第二个swap实现对Y的转置,第三个swap实现对(XTY T)的转置。
代码1:新建一个string result;执行出来的结果没有通过测试用例,不懂逻辑问题出在哪里,需要再排查
class Solution {
public:
string LeftRotateString(string str, int n) {
int len = str.size();
if(len == 0) return str;
string result;
while(n > len)
n = n-len;
for(int i=n; i<len;i++){
for(int j= 0;j<len-1-n;j++){
result[j] = str[i];
}
}
for(int i=0; i<n; i++){
for(int j=len-n-1;j<len;j++){
result[j] = str[i];
}
}
return result;
}
};
代码2:swap方法
class Solution {
public:
string LeftRotateString(string str, int n) {
int len = str.size();
if(len == 0) return str;
//while(n > len)
//n = n-len;
n = n%len;
for(int i=0,j=n-1;i<j;i++,j--) swap(str[i],str[j]);
for(int i=n,j=len-1; i<j; i++,j--) swap(str[i],str[j]);
for(int i=0,j=len-1; i<j; i++,j--) swap(str[i],str[j]);
return str;
}
};