Java刷题:轮转数组

目录

题目

解题思路

完整代码


题目

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例:

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]

解题思路

主要的解题思路是,先把整个数组翻转过来,再把要翻转的部分翻转为正确顺序,最后再把剩余的部分翻转回来,这就是说总体上有三次大翻转,其余的小翻转次数暂时不计。

首先我们可以先自己实现一个reverse方法,来实现数组中部分元素位置的交换,这里和之前学过的数值交换的方法很像。

    private void reverse(int[] nums, int i, int j) {
        while (i < j) {
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
            i++;
            j--;
        }
    }

从上面题目所描述的要求我们能得出这样一个规律:

轮转k次 等于 轮转k%n次

   public void rotate(int[] nums, int k) {
        int n = nums.length;
        k %= n; // 
        reverse(nums, 0, n - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, n - 1);
    }

完整代码

class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length;
        k %= n; // 轮转 k 次等于轮转 k%n 次  k = 3
        reverse(nums, 0, n - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, n - 1);
    }

    private void reverse(int[] nums, int i, int j) {
        while (i < j) {
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
            i++;
            j--;
        }
    }
}


public class Test {
    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] arr = {1,2,3,4,5,6,7};
        solution.rotate(arr,3);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

如果,对于其中某些步骤不是很了解的情况下,可以通过调试的方式,慢慢来了解里面的含义,关于调试部分,可以看这部分:Java刷题:移除数组中与k值相等的元素-CSDN博客

猜你喜欢

转载自blog.csdn.net/xiaochuan_bsj/article/details/140974161