給定一個數(shù)組,將數(shù)組中的元素向右移動 k 個位置,其中 k 是非負(fù)數(shù)。
示例 1:
輸入: [1,2,3,4,5,6,7] 和 k = 3
輸出: [5,6,7,1,2,3,4]
解釋:
向右旋轉(zhuǎn) 1 步: [7,1,2,3,4,5,6]
向右旋轉(zhuǎn) 2 步: [6,7,1,2,3,4,5]
向右旋轉(zhuǎn) 3 步: [5,6,7,1,2,3,4]
示例 2:
輸入: [-1,-100,3,99] 和 k = 2
輸出: [3,99,-1,-100]
解釋:
向右旋轉(zhuǎn) 1 步: [99,-1,-100,3]
向右旋轉(zhuǎn) 2 步: [3,99,-1,-100]
說明:
盡可能想出更多的解決方案,至少有三種不同的方法可以解決這個問題。
要求使用空間復(fù)雜度為 O(1) 的原地算法。
第一次提交
想法非常簡單,就是移動一次我就從數(shù)組尾部刪除一個加到數(shù)組前
var rotate = function(nums, k) {
for(let i=0;i<k;i++){
const num = nums.pop();
nums.unshift(num)
}
};

QQ圖片20190319074118.png
第二次提交
優(yōu)化了一下,數(shù)組長度為1或者數(shù)組長度和k相同的直接返回,移動步數(shù)大于長度的可以求余節(jié)省步數(shù),最后不用一個個操作,直接把移動多少用splice切出來再塞前面
var rotate = function (nums, k) {
const length = nums.length;
if (length === k || length === 1) {
return nums
} else {
if (length < k) {
k = k % length
}
nums.unshift(...nums.splice( - k, k));
}
};

QQ圖片20190319075412.png
最優(yōu)解
看了下最優(yōu)解,和我第二次提交用的方法基本是一樣的
var rotate = function(nums, k) {
let l = nums.length;
k %= l
nums.unshift(...nums.splice(nums.length - k, k))
};