旋转字符串
给定一个字符串(以字符数组的形式给出)和一个偏移量,根据偏移量原地旋转字符串(从左向右旋转)
样例
样例 1:
输入: str=“abcdefg”, offset = 3
输出: “efgabcd”
样例解释:
返回旋转后的字符串。
原来的算法实现:
public class Solution {
/**
* @param str: An array of char
* @param offset: An integer
* @return: nothing
*/
public void rotateString(char[] str, int offset) {
int len = str.length;
int count = len - offset;
String str1 = new String(str, count, offset);
String str2 = new String(str,0,count);
String result = str1+str2;
System.out.println(result);
}
}
原来算法打算是用字符串截取的方式将源字符串分成两个再进行拼接,虽然在eclipse运行正确,但是在lintcode运行却报WA。找了半天不知道原因在哪,又去网上找了一份答案,如下:
public static void rotateString(char[] str, int offset) {
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;
}
String result = String.valueOf(str);
System.out.println(result);
}
这次在lintcode运行成功。
总结:字符串数组旋转应该首先考虑到对数组字符位置进行循环移动,同时注意要有判断参数为不为空和为不为0的意识,比如这儿不进行字符长度和偏移量0判断的话提交就会报错。总体思路就是先保存最末尾的字符,然后从头整体开始向右移动(会覆盖最后一个字符,并且第一位和第二位字符重复),将提前保存好的字符赋给第一位。