题目
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
思路:
左旋和右旋实际上是一样的。我们实际上可以采用翻转字符串来解决。左旋和右旋,实际上是把字符串分为两部分,前半部分放到后面,后半部分放到前面-》这个直接使用一个全局翻转就可以得到,然后在看两部分,我们会发现两个子串在其范围内是反的,那么分别在来一次翻转就可以得到我们想要的结果。
代码实现:
public class Solution {
private void swap(char[] ch,int a,int b){
char tmp=ch[a];
ch[a]=ch[b];
ch[b]=tmp;
}
private void reverse(char[] ch,int l,int r){
while(l<r){
swap(ch,l++,r--);
}
}
public String LeftRotateString(String str,int n) {
if(str==null||str.length()==0)
return "";
if(n>str.length()){
n=n%str.length();
}
char ch[]=str.toCharArray();
reverse(ch,0,str.length()-1);
reverse(ch,0,n-1);
reverse(ch,n,str.length()-1);
return new String(ch);
}
}