题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
代码
1.这种写法比较直球。更简便的是用substring,以n为分割点直接截取两段字符串,换位后拼接。
public class Solution {
public String LeftRotateString(String str,int n) {
if(n>=str.length()){
return str;
}
char[] str1=str.toCharArray();
char[] str2=new char[str1.length];
for(int i=0;i<str1.length;i++){
if(i<n){
str2[str2.length-n+i]=str1[i];
}else{
str2[i-n]=str1[i];
}
}
String result=String.valueOf(str2);
return result;
}
}
2.更新一种解法
看到cyc的题解里说使用额外空间的话可能会有相应的扣分,所以第一种解法作罢。
先将 "abc" 和 "XYZdef" 分别翻转,得到 "cbafedZYX",然后再把整个字符串翻转得到 "XYZdefabc"。
public class Solution {
public String LeftRotateString(String str,int n) {
if(n>=str.length()){
return str;
}
char[] chars=str.toCharArray();
reverse(chars,0,n-1);
reverse(chars,n,chars.length-1);
reverse(chars,0,chars.length-1);
return new String(chars);
}
public void reverse(char[] chars,int i,int j){
while(i<j){
swap(chars,i++,j--);
}
}
public void swap(char[] chars,int i,int j){
char temp=chars[i];
temp=chars[j];
chars[j]=chars[i];
chars[i]=temp;
}
}