LintCode 8.旋转字符串
问题描述
给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转)
样例
对于字符串 “abcdefg”.
offset=0 => “abcdefg”
offset=1 => “gabcdef”
offset=2 => “fgabcde”
offset=3 => “efgabcd”
问题分析
偏移量%字符串长度:真正的偏移量
可以这样理解,假设offset=100000,字符串长度为7,按照正常的思路旋转,中间会有好多重复的步数,则100000%7为真正需要旋转的步数,知道步数,将字符串中的字符按照指定步数旋转。剩下的就是简单的数组操作。
需要注意是,有一种特殊情况,就是字符串为空,要提前判断。
代码
class Solution {
public:
/*
* @param str: An array of char
* @param offset: An integer
* @return: nothing
*/
void rotateString(string &str, int offset) {
// write your code here
char temp;
if(str.length() == 0){
} else {
for (int i = 0; i < offset%str.length(); i++) {
temp = str[str.length()-1];
for (int j = str.length()-1; j > 0; j--) {
str[j] = str[j-1];
}
str[0] = temp;
}
}
}
};
这个代码重复进行多次数组操作,时间上有些不足。
代码改进
class Solution {
public:
/*
* @param str: An array of char
* @param offset: An integer
* @return: nothing
*/
void rotateString(string &str, int offset) {
// write your code here
string str1,str2;
if(str.length() == 0){
} else {
for (int i = 0; i < str.length(); i++) {
if ( i < str.length()-offset%str.length())
str2 += str[i];
else
str1 += str[i];
}
str = str1 + str2;
}
}
};
代码思路
新定义了两个string变量,str1装字符串后面需要移动的子串,str2装前面的子串,最后合并两个子串重新为str赋值。这样做只需要遍历一遍字符串就可以了。