题目:旋转数组
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];
}
};