[Array]Rotate Array

Rotate an array of n elements to the right by k steps.
For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].

方法1:将k%size进行处理后将最后面k个插入到前面。

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        while(k--){
            nums.insert(nums.begin(),nums[nums.size()-1]);
            nums.pop_back();
        }

    }
};

方法2:虽然方法1不是在速度上最好的方法,但是在实现的过程中仍然可以学习到一些细节,例如上面的代码在插入时,是将后面的数字一个接着一个插入到前面,这样每插入一次(insert)nums里面的元素都要进行向后移动一次,这样耗费时间较多。那么将最后k%size个数字取出,然后数组增体向后移动,最后插入到前面。

class Solution {
public:
    void rotate(vector<int>& nums, int k){
        int step = k%nums.size();
        if(step==0)
            return;
        vector<int> vt;
        for(int i = nums.size()-step;i<nums.size();i++){
                vt.push_back(nums[i]);
        }
        for(int i=nums.size()-step-1;i>=0;i--){
            nums[i+step]=nums[i];
        }
        for(int i=0;i<step;i++)
            nums[i]=vt[i];
    }
};

方法2也可以完全用STL的方法进行表示,熟练STL。

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        vector<int> res;
        k = k%nums.size();
        while(k--){
            res.push_back(nums[nums.size()-1]);
            nums.pop_back();
        }
        nums.insert(nums.begin(),res.rbegin(),res.rend());
    }
};

方法3:将第i个与第(i+k)%size个进行交换,然后在(i+k)%size个与(i+2*k)%size个交换,注意(i+n*k)%size==i的情况。

class Solution {
public:
    void rotate(vector<int>& nums, int k){
        if(k%nums.size()==0)
            return ;
        int number = nums.size();
        int i=0,start=i,current_num=nums[i];
        while(number--){
             i = (i+k)%nums.size();
            int temp = nums[i];
            nums[i] = current_num;
            if(start==i){
                i++;
                start=i;
                current_num = nums[i];
            }
            else
                current_num = temp;
        }
        return;
    }
};
posted @ 2016-07-08 12:47  U_F_O  阅读(84)  评论(0编辑  收藏  举报