day:14 189. 轮转数组(中等)
考点:双指针
思路:
- 第一种解法:新建一个数组,计算每个位置该放的元素,将新数组中的值copy到原数组
- 官网第二种解法没有看懂
- 第三种解法:反转整个数组,,以k为界限分别反转[0,k/n-1]区间的元素和[k/n,n-1]区间的元素。至于为什么要界限定在k/n-1是因为需要保证k值的正确性,k最大为数组的长度,此时岂不是修改了k的长度。
使用额外数组
var rotate = function(nums, k) {
let n = nums.length,newArr = [];
for(let i =0;i<n;i++){
newArr[(i+k)%n]=nums[i]
}
for(let i = 0;i<n;i++){
nums[i] = newArr[i]
}
};
反转数组
//反转数组
function revese(nums,start,end){
while(start<end){
//交换数组元素
[nums[start], nums[end]] = [nums[end], nums[start]];
start +=1;
end -= 1;
}
}
var rotate = function(nums, k) {
let k = k%nums.length;
reverse(nums, 0, nums.length - 1);
reverse(nums,0,k%nums.length-1);
reverse(nums,k%nums.length,nums.length-1);
};
网友评论