題目描述:
彙編語言中有一種移位指令叫做循環左移(ROL),現在有個簡單的任務,就是用字符串模擬這個指令的運算結果。對於一個給定的字符序列S,請你把其循環左移K位後的序列輸出。例如,字符序列S=”abcXYZdef”,要求輸出循環左移3位後的結果,即“XYZdefabc”。是不是很簡單?OK,搞定它!
思路:
思路1:
- 循環左移,左移最多的情況就是整個字符序列全部左移動,全部左移動之後爲:abcXYZdefabcXYZdef。
- 因此,我們可以使得字符序列爲雙倍長,爲abcXYZdefabcXYZdef,左移n,那麼我們就可以直接從序列的n位置開始截取,截止到原序列長度+n。
- 比如該序列長度爲9,需要左移動3,那麼序列中“abcXYZdefabcXYZdef”的(3,12)就是我們左移之後的。即XYZdefabc
代碼:
package offer01;
public class TestNo43 {
public static void main(String[] args) {
String a = "abcdfer";
System.out.println(new TestNo43().LeftRotateString(a,3));
}
public String LeftRotateString(String str,int n) {
if(str==null || str.length() == 0){
return str;
}
//雙倍長度
String doubleStr = str+str;
if(n<=doubleStr.length()){
return doubleStr.substring(n,str.length()+n);
}else{
return "";
}
}
}
思路2:
對於序列S=”abcXYZdef”,n = 3:
- 先對序列n之後的部分進行翻轉得到序列S="cbaXYZdef".
- 再對序列n之後的部分進行翻轉得到序列S="cbafedZYX".
- 最後對整個序列進行翻轉得到序列S="XYZdefabc".
代碼:
package offer01;
public class TestNo43_1 {
public static void main(String[] args) {
String a = "abcdfer";
System.out.println(new TestNo43().LeftRotateString(a,3));
}
public String LeftRotateString(String str,int n) {
if(str == null || str.length() == 0){
return str;
}
char[] charArray = str.toCharArray();
//翻轉n之前的部分
reverse(charArray,0,n-1);
//翻轉n之後的部分
reverse(charArray,n,charArray.length-1);
//整體進行翻轉
reverse(charArray,0,charArray.length-1);
return String.valueOf(charArray);
}
//翻轉部分
private void reverse(char[] array,int start,int end){
char temp = ' ';
while (start<end){
temp = array[start];
array[start++] = array[end];
array[end--] = temp;
}
}
}