劍指offer—58_2.左旋轉字串—分析及程式碼(Java)

江南土豆發表於2020-12-31

一、題目

組合語言中有一種移位指令叫做迴圈左移(ROL),現在有個簡單的任務,就是用字串模擬這個指令的運算結果。對於一個給定的字元序列S,請你把其迴圈左移K位後的序列輸出。例如,字元序列 S = “abcXYZdef”,要求輸出迴圈左移 3 位後的結果,即 “XYZdefabc”。是不是很簡單?OK,搞定它!

二、分析及程式碼

1. 兩次翻轉

(1)思路

類似 “58.翻轉單詞順序列” 的思路,先分別翻轉前 k 位和其他部分的字串,再對字串整體進行二次翻轉,即實現目標。

(2)程式碼

public class Solution {
    public String LeftRotateString(String str,int n) {
        if (str.length() == 0 || n <= 0)
            return str;
        String ans = ReverseStr(str, 0, n - 1) + ReverseStr(str, n, str.length() - 1);
        return ReverseStr(ans, 0, str.length() - 1);
    }
    
    public String ReverseStr(String str, int l, int r) {
        String revStr = new String();
        for (int i = r; i >= l; i--)
            revStr = revStr.concat(String.valueOf(str.charAt(i)));
        return revStr;
    }
}

(3)結果

執行時間:23ms,佔用記憶體:9492k。

2. 直接拼接

(1)思路

如果允許使用輔助空間,直接對原字串進行拼接即可。

(2)程式碼

public class Solution {
    public String LeftRotateString(String str,int n) {
        if (str.length() == 0 || n <= 0)
            return str;
        return str.substring(n) + str.substring(0, n);
    }
}

(3)結果

執行時間:19ms,佔用記憶體:9680k。

三、其他

暫無。

相關文章