题目描述:给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转)
对于字符串 "abcdefg"
.
offset=0 => "abcdefg"
offset=1 => "gabcdef"
offset=2 => "fgabcde"
offset=3 => "efgabcd"
很简单的一道题,但是没有考虑到偏移量大于数组长度的情况。还有就是写代码是常量命名的问题,命名超级没有规则,使得代码看起来很乱。(时间 :1067 ms)
思路:创建一个新的数组,先将需要便宜的数字先放入新数组中,之后将不需要便宜的数字按顺序放入新数组中
public class Solution {
/**
* @param str: An array of char
* @param offset: An integer
* @return: nothing
*/
public void rotateString(char[] str, int offset) {
// write your code here
char[] str2=new char[str.length];
int n = str.length-1;
int i=0;
int size = str.length;
if(str.length==0||str == null) return;
if(offset>size) offset = offset % size;
if(offset >=0){
while(offset>0){
str2[offset-1] = str[n];
offset--;
n--;
i++;
}
if(n>=0){ //将剩余的数组按顺序放入新数组当中
for(int j=0;j<=n;j++)
{
str2[i]=str[j];
i++;
}
}
}
for(int k=0;k<str.length;k++){
str[k] =str2[k];
}
}
}
看题解之后,别人的代码,简洁清晰:
例如:[a b c d e f g] offset=3
=>[d c b a e f g]
=>[d c b a g f e] (将整体进行替换)
=>[e f g a b c d]
public class Solution {
/**
* @param str: an array of char
* @param offset: an integer
* @return: nothing
*/
public void rotateString(char[] str, int offset) {
// write your code here
if (str == null || str.length == 0)
return;
offset = offset % str.length;
reverse(str, 0, str.length - offset - 1);
reverse(str, str.length - offset, str.length - 1);
reverse(str, 0, str.length - 1);
}
private void reverse(char[] str, int start, int end) {
for (int i = start, j = end; i < j; i++, j--) {
char temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
}