题目:rotateString
要求:
给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转)
样例:
对于字符串 "abcdefg".
offset=0 => "abcdefg"
offset=1 => "gabcdef"
offset=2 => "fgabcde"
offset=3 => "efgabcd"
算法要求:
在数组上原地旋转,使用O(1)的额外空间
解题思路:
用直接定位法,来进行每个字符的定位。可以理解城对号入座,只需要进行n-1次就可以了。
此算法的时间复杂度为O(n),进行n-1次交换。
算法如下:
void rotateString(string &str, int offset) {
int length = str.length();
int now = 0;//当前last位置所代表字符的初始位置
int last = 0;//考虑到可以能重复循环,用来记录是否重复了,
char tempStr;
if (length == 0 || str == NULL) {
return;
}
if (offset >= length) {
offset = offset % length;
}
if (offset == 0) {
return;
} else {
for (int i = 1; i < length ; i++) {
tempStr = str[abs((offset + now) % length)];
str[abs((now + offset) % length)] = str[last];
str[last] = tempStr;
now = abs((offset + now) % length);
if (now == last) {//如果重复操作了,就进行+1操作
last++;
now = last;
}
}
}
}