LC 189. 旋轉陣列

Mozzie_zhou發表於2020-11-29

LC 旋轉陣列


題目連結: 189. 旋轉陣列

題目描述:

給定一個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。

示例 1:

輸入: [1,2,3,4,5,6,7] 和 k = 3
輸出: [5,6,7,1,2,3,4]
解釋:
向右旋轉 1 步: [7,1,2,3,4,5,6]
向右旋轉 2 步: [6,7,1,2,3,4,5]
向右旋轉 3 步: [5,6,7,1,2,3,4]

示例 2:

輸入: [-1,-100,3,99] 和 k = 2
輸出: [3,99,-1,-100]
解釋:
向右旋轉 1 步: [99,-1,-100,3]
向右旋轉 2 步: [3,99,-1,-100]

package com.zhou.rotate;

import java.util.Arrays;

/**
 * FileName: Rotate
 *
 * @author Mozzie
 * @date 2020/11/29 17:09
 * @Description 旋轉陣列
 */
public class Rotate {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5, 6};
        rotateSolutionTwo(nums, 2);
        System.out.println(Arrays.toString(nums));
    }


    /**
     * 暴力解法
     * 共迴圈 k 次,複製陣列從先記錄最後一位,然後依次覆蓋複製,再講最後一位放置第一位上
     * 若k = 3,nums = [1,2,3,4,5,6,7]
     * 第一次操作:記錄最後一位為7,進行復制操作完後陣列為[1,1,2,3,4,5,6],替換第一位後陣列為:[7,1,2,3,4,5,6]
     * 第二次操作:記錄最後一位為6,進行復制操作完後陣列為[7,7,1,2,3,4,5],替換第一位後陣列為:[6,7,1,2,3,4,5]
     * 第三次操作:記錄最後一位為5,進行復制操作完後陣列為[6,6,7,1,2,3,4],替換第一位後陣列為:[5,6,7,1,2,3,4]
     *
     * @param nums 待旋轉陣列
     * @param k    右移位置
     */
    public static void rotateSolutionOne(int[] nums, int k) {
        for (int i = 0; i < k; i++) {
            int lastNum = nums[nums.length - 1];
            for (int j = nums.length - 1; j > 0; j--) {
                nums[j] = nums[j - 1];
            }
            nums[0] = lastNum;
        }
    }

    /**
     * 使用反轉
     * 若k = 3,nums = [1,2,3,4,5,6,7]
     * 第一次反轉陣列:nums = [7,6,5,4,3,2,1]
     * 第二次反轉陣列,反轉範圍為前k-1個,即為前3個:nums = [5,6,7,4,3,2,1]
     * 第三次反轉陣列,反轉範圍為k至nums.length - 1,即為後4個:nums = [5,6,7,1,2,3,4]
     *
     * @param nums 待旋轉陣列
     * @param k    右移位置
     */
    public static void rotateSolutionTwo(int[] nums, int k) {
        k %= nums.length;
        reverse(nums, 0, nums.length - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, nums.length - 1);

    }

    /**
     * 反轉陣列(首尾替換)
     *
     * @param nums  待反轉陣列
     * @param start 開始
     * @param end   結束
     */
    public static void reverse(int[] nums, int start, int end) {
        while (start < end) {
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start++;
            end--;
        }
    }


}

相關文章