第 77 题:旋转数组算法题
因为步数有可能大于数组长度,所以要先取余
function rotate(arr, k) { const len = arr.length const step = k % len return arr.slice(-step).concat(arr.slice(0, len - step)) } // rotate([1, 2, 3, 4, 5, 6], 7) => [6, 1, 2, 3, 4, 5]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(60)
let rotArr = (arr,k) => {
let len = arr.length
return [...arr,..arr].slice(k,len+k)
}
leetcode 第77题
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
要求使用空间复杂度为 O(1) 的原地算法。
这操作。。。
之前了解到的一个建议是尽量避免在原型链上添加方法。
编程式实现,见笑了
当 k = 0 或 k = arr.length 时,返回结果有误:
rotate([1, 2, 3, 4, 5, 6], 6); // [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]
function rotateArr(arr,k){
return[...arr.splice(-k), ...arr]
}
@zpzxgcr 仔细看题目的example老哥
@zxcweb k = 10000000000
@ChasLui
这样拷贝数组的操作我头一次见。
@kungithub
@kingstone3
@yupeilin123
@i-lijin
都试试下面这个case
@kingstone3 yes
两行解决
const arr = [1, 2, 3, 4, 5, 6, 7]
const k1 = 3
const arr2 = [-1, -100, 3, 99]
const k2 = 2
function change(arr, k) {
return newArr = [...arr.slice(arr.length - k, arr.length), ...arr.slice(0, arr.length - k)]
}
console.log(change(arr, k1), change(arr2, k2));
let a =[1,2,3,4,5,6,7],k=3;
for(let i=0;i<k;i++) { a.unshift(a.pop())}
let arr22 = [1, 2, 3, 4, 5, 6, 7];
const find02 = (arr, k) => {
return arr.splice(arr.length - k).concat(arr)
}
主要就是一个拼接把。。。
function reversal(arr,k){
while(k>0){
k--
var last = arr.pop()
arr.unshift(last)
}
return arr
}
var arr1 = [1, 2, 3, 4, 5, 6, 7];
console.log(reversal(arr1,4))
function re(arr, k) {
var l = arr.length;
var res = []
for(var i = l - 1; i >= 0; i--) {
if(l - k <= i ) {
res.unshift(arr[i]);
} else {
res.splice(k, 0, arr[i])
}
}
来此一游。
function test(arr,count){ return [...arr.slice(arr.length - count),...arr.slice(0,arr.length - count)] }
使用一个快慢指针,找到需要旋转得部分,然后进行拼接。
function removeK(arr,k) {
let slow = 0,fast = k;
let ans = [];
while(fast < arr.length){
slow++;
fast++;
}
for(let i = slow; i < arr.length; i++){
ans.push(arr[i]);
}
return ans.concat(arr.slice(0,slow));
}
let arr = [1, 2, 3, 4, 5, 6, 7];
console.log(removeK(arr,3));
有些拉垮了我
把 k+1 改成 -k 就好了
function f(arr,k){arr.unshift(...arr.splice(-k)); console.log(arr) }
var a = [1,2,3,4,5,6,7];
var move = function(arr,k) {
const len = arr.length
const step = k % len
return arr.slice(len-step).concat(arr.slice(0, len - step))
}
console.log(move(a,3))
拷贝下数组, 防止修改入参
找到一个合适的位置剪掉,unshift到原来的数组, 题目的意思应该是要改变原来的数组,所以直接对原数组开刀。
问题转化为:数组的末尾k个元素移动到数组前面
末尾元素:arr.splice(-k%arr.length)的返回值
剩余元素:arr
test:
moveArr([1,2,3,4,5,6,7],0) => [1,2,3,4,5,6,7]
moveArr([1,2,3,4,5,6,7],5) => [3,4 5,6,7,1,2]
moveArr([1,2,3,4,5,6,7],8) => [7,1,2,3,4,5,6]
你这个是不是有点问题,你把key换成1试一试
这么一对比我的写法好low啊= =