LeetCode题解:189. 旋转数组,环状替换,JavaScript,详细注释

原题链接:https://leetcode-cn.com/problems/rotate-array/

解题思路:

该解法参考了官方题解【旋转数组】原地换位,详细图解,并提供了详细注释,帮助理解。

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function (nums, k) {
  k = k % nums.length; // k可以超出数组长度,
  let count = 0; // 计算遍历次数

  /*
   * 该循环实现2种效果:
   * 1. count为当前移动的次数,当count达到数组的最后一位时,表示翻转已经结束。
   * 2. start为当前翻转的起始位置,为了处理两种情况,参照while循环的条件
   */
  for (let start = 0; count < nums.length; start++) {
    let currentMoveIndex = start; // 记录当前移动的起始位置
    let currentMoveItem = nums[start]; // 记录当前移动的起始值

    do {
      // 计算要移动到的位置,循环移动到当前位置的下k个位置
      let nextMoveIndex = (currentMoveIndex + k) % nums.length;
      // 缓存将要移动位置的值
      let temp = nums[nextMoveIndex];
      // 将当前值移动到下一个位置
      nums[nextMoveIndex] = currentMoveItem;
      // temp的值为下一次要被移动的值
      currentMoveItem = temp;
      // nextMoveIndex即为下一次移动的起始值
      currentMoveIndex = nextMoveIndex;
      count++; // 计算移动次数
    } while (
      /*
       * 会有两种情况:
       * 1. nums.length与k的最大公约数不为1,假设为m。
       *    实际就是经过m次while循环之后,start和currentMoveIndex会相等。
       *    此时需要向后移动start,继续循环。
       * 2. nums.length与k的最大公约数为1,start和currentMoveIndex不会相等。
       *    该循环会一直执行到currentMoveIndex=nums.length-1,
       *    即刚好遍历了数组一次。
       */
      start !== currentMoveIndex
    );
  }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值