1. 程式人生 > >【easy】189. Rotate Array

【easy】189. Rotate Array

例子 旋轉 標簽 nbsp left null back int return

題目標簽: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());
        }
        */
    }
};

【easy】189. Rotate Array