描述
給定一個字符串(以字符數組的形式給出)和一個偏移量,根據偏移量原地旋轉字符串(從左向右旋轉)
樣例
樣例 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;
}
}