题目描述:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”
思路:将string转换为char数组,然后翻转char字符数组,先翻转前半部分,接着翻转后半部分,最后整体翻转既是左移的结果。
代码:
public static String LeftRotateString(String str,int n){
if(str.equals("")||str.length()==0) return "";
if(n>str.length()) n=n%str.length();
char[] chars=str.toCharArray();
reverse(chars,0,n-1);
reverse(chars,n,str.length()-1);
reverse(chars,0,str.length()-1);
StringBuilder sb=new StringBuilder(chars.length);
for(char c:chars){
sb.append(c);
}
return sb.toString();
}
public static void reverse(char[] chars,int low,int high){
char temp;
while(low<high){
temp=chars[low];
chars[low]=chars[high];
chars[high]=temp;
low++;
high--;
}
}
另外,如果先整体翻转,再翻转前半部分跟后半部分,则为右移的结果
public static String LeftRotateString(String str,int n){
if(str.equals("")||str.length()==0) return "";
if(n>str.length()) n=n%str.length();
char[] chars=str.toCharArray();
reverse(chars,0,str.length()-1);
reverse(chars,0,n-1);
reverse(chars,n,str.length()-1);
StringBuilder sb=new StringBuilder(chars.length);
for(char c:chars){
sb.append(c);
}
return sb.toString();
}
public static void reverse(char[] chars,int low,int high){
char temp;
while(low<high){
temp=chars[low];
chars[low]=chars[high];
chars[high]=temp;
low++;
high--;
}
}