1、题目描述
题目链接:http://www.lintcode.com/zh-cn/problem/rotate-string/
给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转)
2、难点分析
特殊情况:①字符串为""的情况②offset=0的情况③offset远大于字符串长度的情况
前两种情况,如果想到了直接return就好。第三种情况难以想到,想到的话也好处理,因为如果偏移量offset为字符串长度的整数倍,那么偏移之后的结果其实就是源字符串,所以真正的偏移量应该为offset%(字符串的长度)。
3、Java代码
public class Solution { /** * @param str: an array of char * @param offset: an integer * @return: nothing */ //没有考虑字符串为""的情况 //没有考虑到offset远大于字符串长度的情况,导致时间超时 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; } } }
方法二:将字符串分成两部分
public class Solution {
/*
* param A: A string
* param offset: Rotate string with offset.
* return: Rotated string.
*/
public char[] rotateString(char[] A, int offset) {
// wirte your code here
//当偏移量为0或者字符数组为空时直接返回原字符数组
if(offset==0||A.length==0){
return A;
}
//当字符数组的长度小于偏移量时,先对其取余
if(offset>A.length){
offset =offset%A.length;
}
//将字符串分为两部分,将第一部分翻转
for(int i = 0,j=A.length-1-offset;i<j;i++,j--){
char temp = A[i];
A[i] = A[j];
A[j] = temp;
}
//将第二部分翻转
for(int i= A.length-offset,j=A.length-1;i<j;i++,j--){
char temp = A[i];
A[i] = A[j];
A[j] = temp;
}
//再将整个字符串翻转
for(int i =0,j=A.length-1;i<j;i++,j--){
char temp = A[i];
A[i] = A[j];
A[j] = temp;
}
return A;
}
};