轮转数组
刀刀
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]
链接地址
答题思路
在一开始,我简单粗暴的想的是通过 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));
};