LeetCode 题解:189. 旋转数组,3 次翻转,JavaScript,详细注释
原题链接:https://leetcode-cn.com/problems/rotate-array/
解题思路:
建议参考漫画:三次旋转的方法是如何想到的,这样思路会比单纯看文字清晰很多。
```javascript []
/**
* @param {number[]} nums
* @param {number} k
* @return {void} Do not return anything, modify nums in-place instead.
*/
var rotate = function(nums, k) {
// 该题有一个隐藏条件,k实际上可以大于nums.length.
// 此时需要按照k % nums.length进行翻转,因此需要增加处理。
k = k % nums.length;
// 翻转链表函数,将start到end的值进行翻转
function reverse(arr, start, end) {
// 当end指针小等于start的时候停止循环。
while (start < end) {
// 使用双指针,每次循环将两个指针的值调换。
let temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
// 调换完成之后,将两个指针向内移动。
start++;
end--;
}
}
// 第一次将整个数组翻转,此时数组的前后部分对调了位置。
// [1,2,3,4,5,6,7]变成了[7,6,5,4,3,2,1]
reverse(nums, 0, nums.length - 1);
// 第二次翻转0到k-1的部分
// [7,6,5,4,3,2,1]变成了[5,6,7,4,3,2,1]
reverse(nums, 0, k - 1);
// 第二次翻转0到k-1的部分
// [5,6,7,4,3,2,1]变成了[5,6,7,1,2,3,4]
reverse(nums, k, nums.length - 1);
};
```
版权声明: 本文为 InfoQ 作者【Lee Chen】的原创文章。
原文链接:【http://xie.infoq.cn/article/250a0dbd65cea2fbb27acb235】。文章转载请联系作者。
评论