1. 程式人生 > 其它 >【劍指offer中等部分16】左旋轉字串(java)

【劍指offer中等部分16】左旋轉字串(java)

技術標籤:劍指offer字串java資料結構

一、題目描述

組合語言中有一種移位指令叫做迴圈左移(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

=fedZYX,XT+YT=cbafedZYX,(XT+YT)T=XYZdefabc,結果即為所求,故整個過程需要三次反轉,也就是三次reverse,前兩次為區域性,最後一次為全域性。

實現程式碼如下:

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);
    }
}

在這裡插入圖片描述