LeetCode 题解:189. 旋转数组,环状替换,JavaScript,详细注释
原题链接:https://leetcode-cn.com/problems/rotate-array/
解题思路:
该解法参考了官方题解和[【旋转数组】原地换位,详细图解](https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-yuan-di-huan-wei-xiang-xi-tu-jie/),并提供了详细注释,帮助理解。
```javascript []
/**
* @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
);
}
};
```
版权声明: 本文为 InfoQ 作者【Lee Chen】的原创文章。
原文链接:【http://xie.infoq.cn/article/840969a9b30207c1eea9dfc67】。文章转载请联系作者。
评论