【算法】数组:旋转数组

88 阅读1分钟

题目:旋转数组

leetcode链接:初级算法 - 旋转数组

说明:给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

理解:

该题描述比较简短,只需按要求将给定数组向右轮转K个位置即可

思路:

1、下标轮转 2、临时变量

题解

方案一:利用(i + k) % length作为下标可实现数组轮转

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function(nums, k) {
    var length = nums.length;
    var temp = [];
    //把原数组值放到一个临时数组中,
    for (var i = 0; i < length; i++) {
        temp[i] = nums[i];
    }
    //然后在把临时数组的值重新放到原数组,并且往右移动k位
    for (var i = 0; i < length; i++) {
        nums[(i + k) % length] = temp[i];
    }
}

方案二:

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */

var rotate = function(nums, k) {
    var len = nums.length
    for (var i = 0; i<k; i++) {
        let previous = nums[len - 1];
        for (var j = 0; j<len; j++) {
            let temp = nums[j];
            nums[j] = previous;
            previous = temp;
        }
    }
};

方案三:环状替换

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
const gcd = (x, y) => y ? gcd(y, x % y) : x;

var rotate = function(nums, k) {
    const n = nums.length;
    k = k % n;
    let count = gcd(k, n);
    for (let start = 0; start < count; ++start) {
        let current = start;
        let prev = nums[start];
        do {
            const next = (current + k) % n;
            const temp = nums[next];
            nums[next] = prev;
            prev = temp;
            current = next;
        } while (start !== current);
    }
};

方案四:

var rotate = function(nums, k) {
    const n = nums.length;
    const newArr = new Array(n);
    for (let i = 0; i < n; ++i) {
        newArr[(i + k) % n] = nums[i];
    }
    for (let i = 0; i < n; ++i) {
        nums[i] = newArr[i];
    }
};