写点什么

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

用户头像
Lee Chen
关注
发布于: 2020 年 08 月 05 日
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

);

}

};

```



发布于: 2020 年 08 月 05 日阅读数: 49
用户头像

Lee Chen

关注

还未添加个人签名 2018.08.29 加入

还未添加个人简介

评论

发布
暂无评论
LeetCode题解:189. 旋转数组,环状替换,JavaScript,详细注释