原文:189. 旋转数组(leetcode 解题) - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/leetcode/leetcode-javascript-solution-0189/

题目:

难度:Easy

相关话题:数组

给定一个数组,将数组中的元素向右移动k 个位置,其中k 是非负数。

示例 1:

输入: [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:

输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]

说明:

  • 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。

  • 要求使用空间复杂度为O(1) 的原地算法。

/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function(nums, k) {
  function reverse(arr, begin, end) {
    while(begin < end){
      var temp = arr[begin]
      arr[begin] = arr[end]
      arr[end] = temp
      begin++
      end--
    }
  }
  var length = nums.length
  var mod = k % length
  if (mod === 0) {
    return
  }
  reverse(nums, length - mod, length -1)
  reverse(nums, 0, length - mod - 1)
  reverse(nums, 0, length - 1)
};

扩展阅读: