- 给定一个数组,将数组向右旋转k步,其中k为非负数。**
- 示例1:**
- 输入:**[1、2、3、4、5、6、7]且k = 3
- 产出:**[5、6、7、1、2、3、4]
- 说明:**
第一步:[7、1、2、3、4、5、6]
第二步:[6、7、1、2、3、4、5]
第三步:[5、6、7、1、2、3、4]
我的解决方案:
var rotate = function(nums, k) {
while(k>0){
let lastelm = nums[nums.length-1];
for(let i =nums.length; i>0;i--){
temp = nums[i-1];
nums[i-1] = nums[i-2];
}
nums[0]=lastelm
k--;
}
};
时间复杂度O(k * nums. length)
我修改整个数组的次数是k
还有什么更好的方法呢?
4条答案
按热度按时间lmyy7pcs1#
你可以使用
.slice
从数组中取出两个切片--一个从开头开始,在中间结束,另一个从中间开始,在结尾结束,然后按相反的顺序重新组合它们:如果您 * 必须 * 改变现有数组,则:
如果
k
可能大于数组的长度,则首先对其使用modulo:uxhixvfz2#
最简单的方法就是在读或写数组时跟踪移位,也就是说,存储一个常量“shift”,在读或写索引为i的数组时,调整为(i + shift)%(数组大小)。
cqoc49vn3#
unshift与pop的组合似乎有一个窍门:
sqougxex4#