Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述:
给定一个数组,将数组中的元素向右轮转 K 个位置,其中 K 是非负数。
思路分析:
通过使用一个临时数组,将轮转后的值存到新数组的新位置。需要注意的是,数组的临界,即如果超过最大的长度时需回到数组首位继续计算。
如nums = [-1,-100,3,99], k = 2
其中,3 在第i = 2 位,位移 k= 2位,则应该在 第 i = 4位,但是数组的长度是length = 4,轮转到i= 4时应该转到 i= 0位。所以临界条件时 i>=4 时,轮转后的位置应该是 i-length。
但是对于,如果数组只有一个元素,或者说数组内元素少于要乱转的位置数,以上就无法满足,所以需要使用(i + k) % length来计算轮转后的位置。
以上使用了一个临时数组,如果在原数组上如何解决呢?
通过先全部都进行反转,再反转前 K 个 ,最后再将剩余的都反转,其实整个过程就是最后的结果
原数组:【-1,100,3,99】
全部反转:【99,3,100,-1】
反转前 2个:【3,99,100,-1】
再反转剩余的:【3,99,-1,100】
就得到最终结果了。
AC 代码:
使用临时数组实现
var rotate = function(nums, k) {
var temps =[];
for(var i=0;i<nums.length;i++){
temps[(i+k)%nums.length] = nums[i];
}
for(var i=0;i<nums.length;i++){
nums[i] = temps[i];
}
};
要求空间复杂度为 O(1)的实现
var rotate = function(nums, k) {
int leng = nums.length;
k % = leng
reverse(nums,0, leng-1)
reverse(nums,0, k-1)
reverse(nums,k, leng-1)
}
function reverse(nums, start, end){
while(start<end){
let temp = nums[start];
nums[start++] = nums[end]
nums[end--] = temp;
}
}
\