题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
public class Solution {
public String LeftRotateString(String str,int n) {
}
}
两种思路:思路一:用内置函数substring来解决(不推荐,,没什么太大意义,面试官不会认可,写出来只是因为自己只想到这个方法)
public class Solution {
public String LeftRotateString(String str,int n) {
char[] cc=str.toCharArray();
if(str.length()==0 || str==null)
return str;
if(n>=0 && n<=str.length())
{
String sub=str.substring(0,n); //使用内置函数substring取出前n个字符
String fin=str.substring(n,str.length())+sub;//使用内置函数substring取出n后的字
// 符,并与前n个字符连接
return fin;
}
return null;
}
}
思路二:看做是翻转字符串的进阶题。可将abcXYZdef分为两部分,把前n个分到第一部分,后面的字符都分到第二部分。假设n=3,则abc为第一部分,后面的XYZdef为第二部分,先分别翻转这两个部分,于是可得到“cda fedZYX”,再翻转整个字符串,即可得到“XYZdef abc”,也就是我们想要的结果。--把原始字符串左旋转两位的结果。---代码也很简单---很秒的思想
public class Solution {
public String LeftRotateString(String str,int n) {
if(str.length()==0 || str==null)
return str;
//String s;
int len=str.length();
// str=Reverse(0,len-1,str); //翻转整个字符串
// str=Reverse(0,len-1-n,str);//分别翻转这两个部分
// str=Reverse(len-n,len-1,str);
str=Reverse(0,n-1,str); //换一种思路:先翻转前n个字符,再翻转后面的字符,最后翻转整个
//字符串
str=Reverse(n,len-1,str);
str=Reverse(0,len-1,str);
return str;
}
//翻转字符串中从i到j位的字符
public String Reverse(int i,int j,String str){
char []cc=str.toCharArray();
while(i<j){
char temp=cc[i];
cc[i]=cc[j];
cc[j]=temp;
i++;
j--;
}
return String.valueOf(cc);
}
}