javascript - 更好/更快的算法来旋转数组?
问题描述
给定一个数组,将数组向右旋转 k 步,其中 k 为非负数。
示例 1:
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
第 1 步:[7,1,2,3,4,5,6]
第 2 步:[6,7,1,2,3,4,5]
第 3 步:[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 一样多
有什么更好的方法呢?
解决方案
您可以使用.slice
从数组中取出两个切片 - 一个从开头开始,在中间结束,另一个切片从中间开始并在末尾结束。然后以相反的顺序重新组合它们:
const rotate = (nums, k) => [...nums.slice(-k), ...nums.slice(0, -k)];
console.log(rotate([1,2,3,4,5,6,7], 1));
console.log(rotate([1,2,3,4,5,6,7], 3));
如果您必须改变现有数组,则:
const rotate = (nums, k) => {
const moveAfter = new Array(k).concat(nums.slice(0, -k));
Object.assign(nums, nums.slice(-k), moveAfter);
return nums;
};
console.log(rotate([1,2,3,4,5,6,7], 1));
console.log(rotate([1,2,3,4,5,6,7], 3));
如果k
可能大于数组的长度,请先对其使用取模:
const rotate = (nums, kPossiblyOutOfRange) => {
const k = kPossiblyOutOfRange % nums.length;
return [...nums.slice(-k), ...nums.slice(0, -k)];
}
console.log(rotate([1,2,3,4,5,6,7], 1));
console.log(rotate([1,2,3,4,5,6,7], 8));
console.log(rotate([1,2,3,4,5,6,7], 3));
推荐阅读
- javascript - 两个窗格、烛台和带有标志的成交量中的高库存 turbothreshhold 问题
- python - 向 Keras 中的 LSTM 提供训练任务
- amazon-web-services - CloudFormation:阻止删除资源
- azure-service-fabric - Azure 服务结构应用程序日志未出现在应用见解中
- java - 为什么 java.util.concurrent.PriorityBlockingQueue 使用数组而不是链表
- c - 在 C 中实现管道的餐饮哲学家
- android - 在sql DB中添加一行的多列
- ios - UIImagePickerController 允许编辑布局
- node.js - 使用 fs 流获取图片的 api 使用 connect-history-api-fallback 返回 304
- docker - 在 NetworkSettings Docker 容器中分配 IPAddress