描述
给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转)
样例
样例 1:
输入: str="abcdefg", offset = 3
输出: "efgabcd"
样例解释:
返回旋转后的字符串。
样例 2:
输入: str="abcdefg", offset = 0
输出: "abcdefg"
样例解释:
返回旋转后的字符串
样例 3:
输入: str="abcdefg", offset = 1
输出: "gabcdef"
样例解释:
返回旋转后的字符串
样例 4:
输入: str="abcdefg", offset =2
输出:"fgabcde"
样例解释:
返回旋转后的字符串
挑战
在数组上原地旋转,使用O(1)的额外空间
解题思路
要做出这道题数学必须好。我做完后觉得洞察天机觉得一定有最大公约数的tag。然后一看,并没有。就想着可能tag都不是奔着挑战去打的吧。。只能这么安慰自己了。这道题我觉得最难的是在原地旋转的条件下使用O(1)的额外空间,要考虑的是谁转过谁没转过。- -当然后来去看了其他人怎么做的,发现自己单纯是步子跨太大想多了。。哎
代码
class Solution {
public:
/**
* @param str: An array of char
* @param offset: An integer
* @return: nothing
*/
void one_loop(string &str, int offset, int cur_pos){
int start_pos = cur_pos;
int size = str.size();
char out_char = str[start_pos];
int next = INT_MAX;
while(next != start_pos){
next = (cur_pos - offset + size) % size;
str[cur_pos] = str[next];
cur_pos = next;
}
int origin = (start_pos + offset) % size;
str[origin] = out_char;
}
int gcd(int min_num, int max_num){
int r = max_num % min_num;
if(r == 0) return min_num;
else return gcd(r, min_num);
}
void rotateString(string &str, int offset) {
// write your code here
int size = str.size();
if(size == 0 || offset % size == 0){
return;
}
offset = offset % size;
int round = gcd(offset, size);
for(int i=0; i<round; i++){
one_loop(str, offset, i);
}
}
};