跳转到内容

轮转数组

刀刀

3/20/2025

0 字

0 分钟

题目

描述

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

示例

  • 示例 1:

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

  • 示例 2:

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

链接地址

leedCode链接

答题思路

在一开始,我简单粗暴的想的是通过 splice 删除 k 个元素,然后通过 unshift 添加到数组头部,但是当 k 大于 num 的长度这个方法是错误的。后面我想着添加一个 if 判断,如果小于 nums 长度就用 splice 方法;如果大于则用循环的方法,但是这样代码太冗余了。

后面看了一下题解,运用数学能力思考了一下,用 k 除以 nums 的长度,如果 k 小于 nums 的长度,则直接返回 k,因为不够除;如果 k 大于 nums 的长度,则得出的余数就是需要删除的元素个数。

举个例子,数组 numns 为 [1,2,3],k 为 7。则 7 次轮转的情况如下:

  • 第一次轮转:[3,1,2]
  • 第二次轮转:[2,3,1]
  • 第三次轮转:[1,2,3]
  • 第四次轮转:[3,1,2]
  • 第五次轮转:[2,3,1]
  • 第六次轮转:[1,2,3]
  • 第七次轮转:[3,1,2]

可以看出来,每轮转 nums 的长度的倍数次后,数组会回到初始状态,最终结果为 k 除以 nums 的长度得出的余数次的结果,所以只需要轮转 k 除以 nums 的长度得出的余数次即可。

解答代码

js
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function(nums, k) {
    k %= nums.length;
    if(k === 0){return};
	nums.unshift(...nums.splice(-k,k));
};