algorithm icon indicating copy to clipboard operation
algorithm copied to clipboard

旋转数组

Open JesseZhao1990 opened this issue 6 years ago • 8 comments

给定一个数组,将数组中的元素向右移动 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))
};

JesseZhao1990 avatar May 02 '18 02:05 JesseZhao1990

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]
};

AshaLiu avatar Aug 08 '18 01:08 AshaLiu

你的第一个是O(n)了吧

AshaLiu avatar Aug 08 '18 01:08 AshaLiu

@AshaLiu 你这招首尾相连不错呀

383366204 avatar Aug 08 '18 01:08 383366204

循环链表完美解决

yunfour avatar Aug 08 '18 06:08 yunfour

list.concat(list.splice(0, k))

Kingsearch avatar Aug 10 '18 08:08 Kingsearch

arr.splice(-k).concat(arr);

这样可以吧?

bjw1234 avatar Aug 18 '18 03:08 bjw1234

arr.splice(-k).concat(arr);

这样可以吧?

你这样如果k大于数组长度呢

383366204 avatar Jun 05 '19 10:06 383366204

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的值取余,这样就可以了吧。:)

bjw1234 avatar Jun 05 '19 13:06 bjw1234