本文參考自《劍指offer》一書,代碼采用Java語言。
題目
字符串的左旋轉操作是把字符串前面的若干個字符轉移到字符串的尾部。請定義一個函數實現字符串左旋轉操作的功能。比如輸入字符串"abcdefg"和數字2,該函數將返回左旋轉2位得到的結果"cdefgab"。
思路
最初的想法是令chars[i] = chars[i+n],將后面的數字都往前移,最后面空出的位置放入前面的數字,如abcdef,n=2時,將c放入a的位置,e放入c的位置,a放入e的位置,b也同理,就可以得到cdefab了。但是這沒有考慮到最后空出的位置是否正確,例如abcdefg中,同樣的方法將會得到cdeba,答案錯誤,就是因為后面的位置對應不上。思路錯誤!
正確思路:本題思路和上一道題翻轉單詞順序的原理一模一樣,只是上一道題有空格,這道題沒空格,其實這道題還更簡單。先分別翻轉前半部分字符串和后半部分字符串,最后翻轉整個字符串即可。
測試算例
1.功能測試(對長度為n的字符串,左旋轉-1,0,1,2,n-1,n,n+1位)
2.邊界值測試(null)
Java代碼
//題目:字符串的左旋轉操作是把字符串前面的若干個字符轉移到字符串的尾部。
//請定義一個函數實現字符串左旋轉操作的功能。比如輸入字符串"abcdefg"和數
//字2,該函數將返回左旋轉2位得到的結果"cdefgab"。
public class LeftRotateString {
public String leftRotateString(char[] chars,int n) {
if(chars==null ||chars.length<=0)
return String.valueOf(chars);
if(n<=0 || n>chars.length)
return String.valueOf(chars);
reverse(chars,0,n-1);
reverse(chars,n,chars.length-1);
reverse(chars,0,chars.length-1);
return String.valueOf(chars);
}
private void reverse(char[] chars, int start,int end){
while(start<end){
char temp=chars[start];
chars[start]=chars[end];
chars[end]=temp;
start++;
end--;
}
}
}
收獲
1.這道題看似是移動字符,其實是翻轉字符串實現的,要記住這類方法。知識遷移能力呀!
