Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
轮转数组
给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
示例 1:
输入: nums = [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:
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]
提示:
- 1
<= nums.length <= - <= nums[i] <=
0 <= k <=
思路分析
- 分析题目可以得知,最终的结果需要将数组的后
k项截出来放到数组的最前面; - 因此第一时间想到数组的
splice方法,可以将数组的某几项删除并返回; - 很开心的写了得到了截出来的数组,但是在往数组最前面拼接的时候,使用了
concat方法,使用了 解构赋值,都不可改变原数组nums; - 于是将右半段和左半段分别存储起来,然后循环一项一项赋值;
- 在跑测试用例的时候,卡在了
[1,2],3上,发现k可以大于数组的长度,于是做了判断k = k > len ? k - len : k,继续开心的跑用例; - 这次卡在了
[1,2],5上,于是发现k可以是数组长度的好几倍,于是完善了判断k = k > len ? k % len : k.
AC 代码
/**
* @param {number[]} nums
* @param {number} k
* @return {void} Do not return anything, modify nums in-place instead.
*/
var rotate = function(nums, k) {
const len = nums.length
k = k > len ? k % len : k
const rightArr = nums.splice(len - k)
const temp = nums.splice(0)
for(let i = 0; i< len; i++) {
if(i < k) {
nums[i] = rightArr[i]
} else {
nums[i] = temp[i-k]
}
}
};
结果:
- 执行结果: 通过
- 执行用时:88 ms, 在所有 JavaScript 提交中击败了84.08%的用户
- 内存消耗:54.5 MB, 在所有 JavaScript 提交中击败了4.98%的用户
- 通过测试用例:38 / 38