LintCode算法刷題之旋轉字符串

鏈接:旋轉字符串

描述

給定一個字符串(以字符數組的形式給出)和一個偏移量,根據偏移量原地旋轉字符串(從左向右旋轉)

樣例

樣例 1:
輸入: str="abcdefg", offset = 3
輸出: "efgabcd"
樣例解釋:
返回旋轉後的字符串。

樣例 2:
輸入: str="abcdefg", offset = 0
輸出: "abcdefg"
樣例解釋:
返回旋轉後的字符串

樣例 3:
輸入: str="abcdefg", offset = 1
輸出: "gabcdef"
樣例解釋:
返回旋轉後的字符串

樣例 4:
輸入: str="abcdefg", offset =2
輸出:"fgabcde"
樣例解釋:
返回旋轉後的字符串

挑戰

在數組上原地旋轉,使用O(1)的額外空間

算法思路

這個過程實際上是將最後一個元素放到第一個位置上的過程,偏移量是幾,就移動幾次
1.將最後一個元素臨時保存
2.從倒數第二個元素開始,往後串一個位置
3.將臨時保存的元素放置在第一個位置
當偏移量大於數組長度時,是週期的操作,我們做取模運算,減少無謂的操作次數

所以我們需要重複以上步驟,共N次,N = offset % str.length

代碼

 public static void rotationStr(char[] str, int offset) {

        if (str == null || str.length == 0 || offset == 0) {
            return;
        }

        char tempChar;
        int len = str.length;

        for (int i = 0; i < offset % len; i++) {

            //將最後一個元素臨時保存下來,之後放在開頭
            tempChar = str[len - 1];

            //集體往後串一位
            //由於要將最後一個元素臨時保存下來,我們需要從後面開始
            int j = len - 2;
            while (j >= 0) {
                str[j + 1] = str[j];
                j--;
            }

            //將臨時保存的元素放在開頭
            str[0] = tempChar;
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章