汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
分析
对于原本需要左移动的字符串 "abcXYZdef ",如果左移动3位,就变成 : "XYZdef" + "abc", 则
设:n=3,N=9(字符串总长度)
可以遍历一遍数组,使用两个ind1=0,ind2,一个ind1指向开头,一个ind2指向移动后的第一个开头字符。
ind1保持不变,ind2每次减去 n(n=3),如果n<0,n = n+N。
原本ind2位置的数字被置换到0位置,则ind2的目标位置是在ind2-n。
在n不被N整除情况下,可以最终遍历完数组,但是n会被N整除的情况下则无法完成遍历
但是为了防止n会被N整除,可以把n减去1
代码实现
string LeftRotateString(string str, int n) { int N = str.size(); if(N<=0||n<=0||N==n)return str; int sign = 0; if(N%n==0&&n!=1){ n-=1; sign=1; } int position_now = 0; int position_target = -n+N; while(position_now!=position_target){ swap(str[position_now],str[position_target]); //cout<<position_now<<" "<<position_target<<endl; position_target = position_target-n; while(position_target<0) position_target+=N; } if(sign){ char tmp = str[0]; auto a = str.begin(); for(;a!=str.end()-1;a++){ *a=*(a+1); } *a=tmp; } return str; }