题目:对于一个字符串,请设计一个算法,将字符串的长度为len的前缀平移到字符串的最后。
给定一个字符串A和它的长度,同时给定len,请返回平移后的字符串。
测试样例:"ABCDE",5,3返回:"DEABC"
思路:与String2左旋字符串近似。先对len取模避免len越界(常识:模数不能是0),方法一:拼接成为str=str+str的大字符串从len位置开始取出length的字符串即可。方法二:将前面l长度为len的字符串和后面的部分字符串看作是两个句子,于是使用2次反转可以解决问题,先对2个单词内部进行反转,再对整个句子进行反转。例如要对abcdefg的len=2即前面2个字符进行反转,于是先反转得到bagfedc,再对整个句子进行反转得到cdefgab.由于len是明确的,因此比反转句子还要简单。注意,这里最好先对子字符串进行反转再对整个句子进行反转,否则反转范围容易出错。
importjava.util.*;
//使用2次反转实现左旋转
publicclass Translation {
public String stringTranslation(String A,int n, int len) {
//特殊输入
if(A==null||A.length()<=0) return A;
//取模,避免len溢出,常识:模数不能是0
len=len%(A.length());
//将字符串转化为字符数组进行操作
char[] array=A.toCharArray();
//先对2个子字符串进行内部的反转
this.reverse(array,0,len-1);
this.reverse(array,len,A.length()-1);
//对整个字符串进行反转
this.reverse(array,0,A.length()-1);
//返回结果,注意结果是字符串
return String.valueOf(array);
}
//该方法用于对数组array中从[beginIndex开始到endIndex]范围的字符串进行反转
public void reverse(char[] array,int beginIndex,int endIndex){
while(beginIndex<endIndex){
char temp=array[endIndex];
array[endIndex--]=array[beginIndex];
array[beginIndex++]=temp;
}
}
}