8. 旋转字符串
给定一个字符串(以字符数组的形式给出)和一个偏移量,根据偏移量原地
旋转字符串(从左向右旋转)
样例
样例 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)的额外空间
注意事项
offset >= 0
解答
代码
public void rotateString(char[] str, int offset) {
// write your code here
char temp;
if(offset==0) return;
if(str.length==0)return;
int len=str.length;
for(int i=1;i<=offset%len;i++){
temp=str[len-1];
int j=len-2;
while(j>=0){
str[j+1]=str[j];
j--;
}
str[0]=temp;
}
System.out.println(str);
}
思路
一个char数组,一个偏移量.要移动char数组中的值,为了使偏移量输入多少,我们都可以适用.因此要一个一个的移动值.
使用一个temp保存要移动的数,将其他数后移,随后将temp值赋给开头.
假设数组长度为5
现在考虑,我们应该移动多少次?
1.offset为0:移动0次
2.offset为4:移动4次
3.offset为6:移动1次
4.offset为10:移动0次
所以,可以确定移动五次以内,是随着数组长度改变的.
这让我想起了,曾经写过的代码,不论给你的数是多少,我使用%,结果就可以控制.
因此,我们应该移动:offset%char.length 次
特殊情况的考虑:
1.offset为0:可以直接return,不return,for循环也是0次.
2.char[]数组为"":直接return,这个不return会报错的,x%0会报错!
解析
代码首先为特殊情况考虑,随后使用for循环控制移动次数,使用temp保存移动变量,使用while循环在for循环中做一次变量的整体移动.