leetcode189-轮转数组
leetcode 189
方法一
思路
首先需要处理k的长度,k的值可以大于nums.length, 这时候需要取余,得到实际需要反转的次数即可,不需要重复去反转,当k=0或者k为nums.length的倍数时,轮转以后的结果都是nums本身
nums = [1,2,3,4,5,6,7], k = 3
轮转以后需要得到的nums = [5,6,7,1,2,3,4]
我们可以把后k个截取出来,得到item = [5,6,7] 此时nums = [1,2,3,4]
然后把item插入到nums头部:nums = [5,6,7,1,2,3,4]
var rotate = function (nums, k) {k = k % nums.length;if (k === 0) return;// 截取后k个元素const item = nums.splice(nums.length - k)// 把后k个元素放在nums头部nums.unshift(...item)
};
方法二
思路
通过三次反转可以实现对应的结果
nums = [1,2,3,4,5,6,7] k = 3
- 步骤一:反转整个数组 nums = [7,6,5,4,3,2,1]
- 步骤二:反转前k个元素 nums = [5,6,7,4,3,2,1]
- 步骤三:反转剩余元素 nums = [5,6,7,1,2,3,4]
var rotate = function (nums, k) {k = k % nums.length;// 首先反转数组reverse(nums, 0, nums.length - 1)// 反转前k个元素reverse(nums, 0, k - 1)// 反转剩余元素reverse(nums, k, nums.length - 1)
};
function reverse(nums, left, right) {while (left < right) {const item = nums[left];nums[left] = nums[right];nums[right] = itemleft++right--}
}