LeetCode算法入门 — 轮转数组

125 阅读1分钟

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 <= 10510^5
  • 231-2^{31} <= nums[i] <= 23112^{31} - 1
  • 0 <= k <= 10510^5

思路分析

  1. 分析题目可以得知,最终的结果需要将数组的后 k 项截出来放到数组的最前面;
  2. 因此第一时间想到数组的 splice 方法,可以将数组的某几项删除并返回;
  3. 很开心的写了得到了截出来的数组,但是在往数组最前面拼接的时候,使用了 concat 方法,使用了 解构赋值,都不可改变原数组 nums
  4. 于是将右半段和左半段分别存储起来,然后循环一项一项赋值;
  5. 在跑测试用例的时候,卡在了 [1,2],3 上,发现 k 可以大于数组的长度,于是做了判断 k = k > len ? k - len : k,继续开心的跑用例;
  6. 这次卡在了 [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

END