【easy】189. Rotate Array

题目标签:Array

  题目给了我们一个数组 和 k。 让我们 旋转数组 k 次。

方法一:

  这里有一个很巧妙的方法:

    利用数组的length - k 把数组 分为两半;

    reverse 左边和右边的数组;

    reverse 总数组。

 

  举一个例子: 

  1 2 3 4 5 6 7  如果k = 3 的话, 会变成 5 6 7 1 2 3 4

  1 2 3 4 5 6 7  middle = 7 - 3 = 4,分为左边 4个数字,右边 3个数字

  4 3 2 1 7 6 5  分别把左右reverse 一下

  5 6 7 1 2 3 4  把总数组reverse 一下就会得到答案

public class Solution 
{
    public void rotate(int[] nums, int k) 
    {
        if(nums == null || nums.length == 0 || k % nums.length == 0)
            return;
        
        int turns = k % nums.length;
        int middle = nums.length - turns;
        
        reverse(nums, 0, middle-1); // reverse left part
        reverse(nums, middle, nums.length-1); // reverse right part
        reverse(nums, 0, nums.length-1); // reverse whole part 
    }
    
    public void reverse(int[] arr, int s, int e)
    {
        while(s < e)
        {
            int temp = arr[s];
            arr[s] = arr[e];
            arr[e] = temp;
            
            s++;
            e--;
        }
    }
}

 

-----------------------------

方法二:

class Solution {
public:
    void rotate(vector<int>& nums, int k) {

        //方法一:另设置一个vector,然后逐个元素添加进去,最后将这个vector赋值给nums。添加方式为将右边的k个元素添加进去,再将左边的n-k个元素添加进去。
        if (nums.size() == 1) return;
        if (k > nums.size())  k %= nums.size();
        vector<int> newNums;
        for (int i = nums.size() - k; i < nums.size(); ++i)
            newNums.push_back(nums[i]);
        for (int i = 0; i < nums.size() - k; ++i)
            newNums.push_back(nums[i]);
        nums = newNums;
        
        //方法二:自带的rotate函数
        /*
        int len = nums.size();
        if (len > 1) {
            k %= len;
            std::rotate(nums.begin(), nums.end() - k, nums.end());
        }
        */
    }
};

 

posted @ 2018-02-12 13:40  Sherry_Yang  阅读(99)  评论(0编辑  收藏  举报