描述
给定一个字符串(以字符数组的形式给出)和一个偏移量,根据偏移量原地旋转字符串(从左向右旋转)
样例
样例 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;
}
}