【劍指offer中等部分16】左旋轉字串(java)
阿新 • • 發佈:2020-12-22
一、題目描述
組合語言中有一種移位指令叫做迴圈左移(ROL),現在有個簡單的任務,就是用字串模擬這個指令的運算結果。對於一個給定的字元序列S,請你把其迴圈左移K位後的序列輸出。例如,字元序列S=”abcXYZdef”,要求輸出迴圈左移3位後的結果,即“XYZdefabc”。是不是很簡單?OK,搞定它!
二、分析
有兩種方法可以解決它
方法一
1、假設S=”abcXYZdef”,n=3,迴圈左移的結果為"XYZdefabc",則設X=abc,Y=XYZdef,我們把X,Y反轉,用XT表示reverse方法,即XT=cba,YT
實現程式碼如下:
public class Solution {
public String LeftRotateString(String str,int n) {
if(str == null || str.length() == 0){
return str;
}
char[] chars = str.toCharArray() ;
//反轉3次
reverse(chars, 0, n-1);
reverse(chars, n, chars.length-1);
reverse(chars, 0, chars.length-1);
return new String(chars);//返回用chars建立的String物件
}
public void reverse(char[] chars, int i, int j){
while(i < j){
char temp = chars[i] ;
chars[i++] = chars[j];
chars[j--] = temp;
}
}
}
方法二
2.1
使用java中的subString,這是小技巧,我們主要還是要掌握方法1,subString就是先將原來的str擴充套件到自身兩倍,即兩個相同的str連線起來。然後取n到str.length+n的字串。如兩倍的字串即為"abcXYZdefabcXYZdef",n=3,那麼n到str.length+n,就是XYZdefabc。
實現程式碼如下:
public class Solution {
public String LeftRotateString(String str,int n) {
if(str == null || str.length() == 0){
return str;
}
String str2 = str + str;
return str2.substring(n, str.length() + n);
}
}
2.2
或者直接取兩次區域性的字串進行連線。也就是取XYZ和defabc兩個部分再拼接。
實現程式碼如下:
public class Solution {
public String LeftRotateString(String str,int n) {
if(str == null || str.length() == 0){
return str;
}
//注意subString擷取方法是左閉右開,所以右邊才往後取一位
return str.substring(n,str.length()) + str.substring(0,n);
}
}