[lintcode] 8.旋转字符串

描述

给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转)

样例

样例  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);
        }
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值