algorithm
algorithm copied to clipboard
旋转数组
给定一个数组,将数组中的元素向右移动 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]
示例 2:
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
说明:
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 要求使用空间复杂度为 O(1) 的原地算法。
算法
方法1
var rotate = function(nums, k) {
for(var i= 1; i<=k; i++){
nums.unshift(nums.pop())
}
};
方法2
var rotate = function(nums, k) {
var a = nums.splice(-k,k);
nums.unshift(...a);
};
方法3
var rotate = function(nums, k) {
nums.splice(0,0,...nums.splice(-k,k))
};
var rotate = function(list, k) {
let array = list; // [1,2,3,4,5,6,7]
let arrayLen = array.length; // 7
let newArray = array.concat(array); // [1,2,3,4,5,6,7,1,2,3,4,5,6,7]
let newArrayLen = newArray.length; // 14
let num = k % arrayLen; // 3
return newArray.slice(arrayLen-num, newArrayLen-num); //(4~11) [5,6,7,1,2,3,4]
};
你的第一个是O(n)了吧
@AshaLiu 你这招首尾相连不错呀
循环链表完美解决
list.concat(list.splice(0, k))
arr.splice(-k).concat(arr);
这样可以吧?
arr.splice(-k).concat(arr);
这样可以吧?
你这样如果k大于数组长度呢
arr.splice(-k).concat(arr);
这样可以吧?
你这样如果k大于数组长度呢
var arr = [1,2,3,4,5,6,7];
var k = 10;
var val = k % arr.length;
arr.splice(-val).concat(arr);
那就对k的值取余,这样就可以了吧。:)