题目
给定一个字符串(以字符数组的形式给出)和一个偏移量,根据偏移量原地旋转字符串(从左向右旋转)
样例
样例 1:
输入: str=“abcdefg”, offset = 3
输出: str = “efgabcd”
样例解释: 注意是原地旋转,即str旋转后为"efgabcd"
样例 2:
输入: str=“abcdefg”, offset = 0
输出: str = “abcdefg”
样例解释: 注意是原地旋转,即str旋转后为"abcdefg"
样例 3:
输入: str=“abcdefg”, offset = 1
输出: str = “gabcdef”
样例解释: 注意是原地旋转,即str旋转后为"gabcdef"
样例 4:
输入: str=“abcdefg”, offset =2
输出: str = “fgabcde”
样例解释: 注意是原地旋转,即str旋转后为"fgabcde"
样例 5:
输入: str=“abcdefg”, offset = 10
输出: str = “efgabcd”
样例解释: 注意是原地旋转,即str旋转后为"efgabcd"
挑战
在数组上原地旋转,使用O(1)的额外空间
注意事项
offset >= 0
str的长度 >= 0
个人思路:
public void rotateString(char[] str, int offset) {
if (str.length < 0 || offset < 0 ) {
return;
}
offset = offset % str.length;
char[] arr = new char[str.length - offset]; //临时数组
for(int i = 0; i < str.length - offset; i++){
arr[i] = str[i]; //保存需要旋转的字符数组
}
int index = 0;
for (int j = str.length - offset; j< str.length;j++) {
str[index] = str[j]; //覆盖前面的值
index++;
}
int temp= 0;
for (int k = 0; k < str.length - offset; k++) {
str[index] = arr[temp];
index++;
temp++;
}
}
他人思路:
public void rotateString(char[] str, int offset) {
if(str == null || str.length == 0){
return;
}
int len = str.length;
offset = offset % len;
reverse(str, 0, len - offset - 1);
reverse(str, len - offset, len - 1);
reverse(str, 0, len - 1);
}
private void reverse(char[] str,int start,int end){
for( ;start < end; start++,end--){
char tmp = str[start];
str[start] = str[end];
str[end] = tmp;
}
}
跟别人对比了下代码,发现自己还有很长的路要走啊!