Daily-Interview-Question icon indicating copy to clipboard operation
Daily-Interview-Question copied to clipboard

第 77 题:旋转数组算法题

Open ZodiacSyndicate opened this issue 6 years ago • 137 comments

因为步数有可能大于数组长度,所以要先取余

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]

ZodiacSyndicate avatar May 20 '19 00:05 ZodiacSyndicate

var arr = [-1, -100, 3, 99];
var k = 5;

for (let i = 0; i < k; i++) {
	let val = arr.pop();
	arr.unshift(val);
}

console.log(arr);

sgzhm4444 avatar May 20 '19 01:05 sgzhm4444

var rotate = function(nums, k) {
    for(var i = 0;i<k;i++){
        nums.unshift(nums.pop())
    }
    return nums;
}

zxcweb avatar May 20 '19 01:05 zxcweb

/* 第 77 题:旋转数组算法题

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

输入: [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] */

const rotateAry = (ary, k) => {
	let len = ary.length
	let rotateNum = k % len
	if (rotateNum === 0) {
		return ary
	}
	let tmpAry = new Array(len)
	ary.forEach((el, index) => {
		if ((index + rotateNum) >= len) {
			tmpAry[index + rotateNum - len] = el
		} else {
			tmpAry[index + rotateNum] = el
		}
	})
	return tmpAry
}
console.log(rotateAry([1, 2, 3, 4, 5, 6, 7], 3))

这么一对比我的写法好low啊= =

YouziXR avatar May 20 '19 01:05 YouziXR

用splice就好了嘛 就不用考虑步数超出数组长度 一行代码解决问题

function rotateArr(arr, k) { 
    return [...arr.splice(k+1), ...arr];
}

image

你这个是不是有点问题,你把key换成1试一试

Rashomon511 avatar May 20 '19 01:05 Rashomon511

问题转化为:数组的末尾k个元素移动到数组前面 末尾元素:arr.splice(-k%arr.length)的返回值 剩余元素:arr

const moveArr = (arr,k)=>arr.splice(-k%arr.length).concat(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]

francecil avatar May 20 '19 02:05 francecil

找到一个合适的位置剪掉,unshift到原来的数组, 题目的意思应该是要改变原来的数组,所以直接对原数组开刀。

Array.prototype.rotate = function rotateArr(k = 0) {
    const len = this.length;
    if(!len) {
	return this;
    }
    k = k % len;
    if(k <= 0) {
	return this;
    }
    const cut = this.splice(len - k);
    return this.unshift(...cut);
}
let a = [1, 2, 3, 4, 5, 6];
a.rotate(3);

RichardPear avatar May 20 '19 02:05 RichardPear

function rotateArr(arr, k) { 
    return [...arr.splice(k+1), ...arr];
}

拷贝下数组, 防止修改入参

function rotateArr(arr, k) {
  const _tmp = JSON.parse(JSON.stringify(arr));
  return [..._tmp.splice(k + 1), ..._tmp];
}

ChasLui avatar May 20 '19 02:05 ChasLui

function rotateStep(arr: any[]) {
  arr.unshift(arr.pop());
}

function rotateTimes(arr: any[], k: number) {
  for(let i=0; i<k; i++) {
    rotateStep(arr);
  }
}

const  arr = [1, 2, 3, 4, 5, 6, 7, 8];
rotateTimes(arr, 1);

console.log(`arr ${JSON.stringify(arr)}`);

benzhemin avatar May 20 '19 03:05 benzhemin

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))

dhzou avatar May 20 '19 03:05 dhzou

function f(arr,k){arr.unshift(...arr.splice(-k)); console.log(arr) }

kungithub avatar May 20 '19 03:05 kungithub

用splice就好了嘛 就不用考虑步数超出数组长度 一行代码解决问题

function rotateArr(arr, k) { 
    return [...arr.splice(k+1), ...arr];
}

image

你这个是不是有点问题,你把key换成1试一试

把 k+1 改成 -k 就好了

kingstone3 avatar May 20 '19 05:05 kingstone3

function rotate(arr, k) {
  if (!Array.isArray(arr) || !arr.length) {
    console.error('参数 arr 必须为长度大于 0 的数组');
    return [];
  }
  if (!Number.isInteger(k) || k <= 0) {
    console.error('参数 k 必须为非负整数');
    return [];
  }
  const _tmp = JSON.parse(JSON.stringify(arr));
  return [..._tmp.splice(-k % _tmp.length), ..._tmp];
}

// test
const arr = [1, 2, 3, 4, 5, 6, 7];
console.log(rotate(arr, 0)); // [1, 2, 3, 4, 5, 6, 7]
console.log(arr); // [1, 2, 3, 4, 5, 6, 7], 纯函数,不改变原数组
console.log(rotate(arr, 'aaa')); // []
console.log(rotate(arr, 2)); // [ 6, 7, 1, 2, 3, 4, 5 ]

ChasLui avatar May 20 '19 06:05 ChasLui

const changeArr = (arr,k) => {
    const len = arr.length;
    return arr.reduce((acc,curr,idx,origin) => {
        const temp = idx+k <= len-1 ? idx+k : idx+k-len;
        acc[temp] = curr;
        return acc
    },[])
}

yaonote avatar May 20 '19 08:05 yaonote

let rotArr = (arr,k) => { let len = arr.length return [...arr,..arr].slice(k,len+k) }

Hunterang avatar May 20 '19 09:05 Hunterang

leetcode 第77题 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 要求使用空间复杂度为 O(1) 的原地算法。

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function (nums, k) {
  nums.unshift(...nums.splice(nums.length - k, k))
  return nums
};

keiseiTi avatar May 20 '19 09:05 keiseiTi

let arr = [1, 2, 3, 4, 5, 6, 7];
let rotate = (arr,k)=>[...arr.slice(-k),...arr.slice(0,-k)]

wubetter avatar May 20 '19 10:05 wubetter

找到一个合适的位置剪掉,unshift到原来的数组, 题目的意思应该是要改变原来的数组,所以直接对原数组开刀。

Array.prototype.rotate = function rotateArr(k = 0) {
    const len = this.length;
    if(!len) {
	return this;
    }
    k = k % len;
    if(k <= 0) {
	return this;
    }
    const cut = this.splice(len - k);
    return this.unshift(...cut);
}
let a = [1, 2, 3, 4, 5, 6];
a.rotate(3);

这操作。。。 之前了解到的一个建议是尽量避免在原型链上添加方法。

bran-nie avatar May 21 '19 03:05 bran-nie

let arr1 = [1, 2, 3, 4, 5]
function func(arr, num) {
    if (num % arr.length === 0) return arr
    return arr.splice(arr.length - (num%arr.length)).concat(arr)
}

image

bran-nie avatar May 21 '19 03:05 bran-nie

let rotateRight = (arr, k) => [...arr.slice(arr.length - k), ...arr.slice(0, arr.length - k)];

pengcc avatar May 21 '19 05:05 pengcc

function rotateArray(array, step) {
    // 旋转长度超过数组长度,只需要旋转余数就行了
    step = step % array.length;
    // splice 方法同时会将原数组截断
    var rotateArray = array.splice(array.length - step);
    // 重新拼接
    return rotateArray.concat(array);
}
rotateArray([1, 2, 3, 4, 5], 6);

mengsixing avatar May 21 '19 14:05 mengsixing

编程式实现,见笑了

function rotateArr(arr, k) {
  let len = arr.length;
  let result = [];

  k = k > len ? k % len : k;

  for (let i = len - 1; i >= 0; i--) {
    if (len - i <= k) {
      result.unshift(arr[i]);
    } else {
      result[i + k] = arr[i];
    }
  }

  return result;
}

wingmeng avatar May 22 '19 00:05 wingmeng

因为步数有可能大于数组长度,所以要先取余

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]

当 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]

wingmeng avatar May 22 '19 00:05 wingmeng

function rotateArr(arr,k){ return[...arr.splice(-k), ...arr] }

i-lijin avatar May 22 '19 13:05 i-lijin

/**
 * solution1
 * 最短路径逐个转移
 */
var rotate = function (nums, k) {
  const len = nums.length;
  let c = k % len;
  if (c > len / 2) {
    c = len - c;
    while (c > 0) {
      nums.push(nums.shift());
      c--;
    }
  }
  else {
    while (c > 0) {
      nums.unshift(nums.pop());
      c--;
    }
  }
};

/**
 * solution2
 * 妙用API一次性转移
 */
var rotate = function (nums, k) {
  nums.unshift(...nums.splice(- (k % nums.length)));
};

/**
 * solution3
 * 三次翻转
 */
var rotate = function (nums, k) {
  k %= nums.length;
  reverse(nums, 0, nums.length - 1);
  reverse(nums, 0, k - 1);
  reverse(nums, k, nums.length - 1);
};

function reverse(nums, start, end) {
  while (start < end) {
    let temp = nums[start];
    nums[start] = nums[end];
    nums[end] = temp;
    start++;
    end--;
  }
}

LiuMengzhou avatar May 23 '19 02:05 LiuMengzhou

用splice就好了嘛 就不用考虑步数超出数组长度 一行代码解决问题

function rotateArr(arr, k) { 
    return [...arr.splice(k+1), ...arr];
}

image

@zpzxgcr 仔细看题目的example老哥

输入: [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]

LiuMengzhou avatar May 23 '19 02:05 LiuMengzhou

var rotate = function(nums, k) {
    for(var i = 0;i<k;i++){
        nums.unshift(nums.pop())
    }
    return nums;
}

@zxcweb k = 10000000000

LiuMengzhou avatar May 23 '19 02:05 LiuMengzhou

function rotateArr(arr, k) { 
    return [...arr.splice(k+1), ...arr];
}

拷贝下数组, 防止修改入参

function rotateArr(arr, k) {
  const _tmp = JSON.parse(JSON.stringify(arr));
  return [..._tmp.splice(k + 1), ..._tmp];
}

@ChasLui 这样拷贝数组的操作我头一次见。

const _tmp = [...arr];

LiuMengzhou avatar May 23 '19 02:05 LiuMengzhou

function f(arr,k){arr.unshift(...arr.splice(-k)); console.log(arr) }

var rotate = function (nums, k) { nums.unshift(...nums.splice(nums.length - k, k)) return nums };

function rotateArr(arr,k){ return[...arr.splice(-k), ...arr] }

@kungithub @kingstone3 @yupeilin123 @i-lijin 都试试下面这个case

f([1,2],13);
> [1, 2]

LiuMengzhou avatar May 23 '19 02:05 LiuMengzhou

function f(arr,k){arr.unshift(...arr.splice(-k)); console.log(arr) } var rotate = function (nums, k) { nums.unshift(...nums.splice(nums.length - k, k)) return nums }; function rotateArr(arr,k){ return[...arr.splice(-k), ...arr] }

@kungithub @kingstone3 @yupeilin123 @i-lijin 都试试下面这个case

f([1,2],13);
> [1, 2]
function rotateArr(arr, k) { 
  return [...arr.splice(-(k % arr.length)), ...arr];
}

kingstone3 avatar May 23 '19 03:05 kingstone3

@kingstone3 yes

LiuMengzhou avatar May 23 '19 03:05 LiuMengzhou

function rotateArr(arr, k) { 
    return [...arr.splice(k+1), ...arr];
}

拷贝下数组, 防止修改入参

function rotateArr(arr, k) {
  const _tmp = JSON.parse(JSON.stringify(arr));
  return [..._tmp.splice(k + 1), ..._tmp];
}

@ChasLui 这样拷贝数组的操作我头一次见。

const _tmp = [...arr];

@LiuMengzhou ... 是 rest/spread 运算符:

  1. 作为 rest 的情况: 函数声明中作为剩余参数,例如 functuin foo(...args) {} 解构赋值中收集剩余元素: let [a, ...arr] = [1, 2, 3, 4] 或 let {a, ...obj} = {a: 1, b:2, c:3}
  2. 作为 spread 的情况: 数组: let arr = [1, ...[2, 3]] 对象: let obj = {a: 1, ...otherObj}

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Rest_parameters https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Spread_syntax

kingstone3 avatar May 23 '19 03:05 kingstone3

@kingstone3 老哥可以的~还引经据典。这些我都会。你看看他的回答

const _tmp = JSON.parse(JSON.stringify(arr)); // 那位老哥写的
const _tmp = [...arr]; // 我写的

LiuMengzhou avatar May 23 '19 03:05 LiuMengzhou

@LiuMengzhou 他的那个方法我也看过,不过有些缺陷 javascript经典面试题之拷贝

kingstone3 avatar May 23 '19 03:05 kingstone3

function rotateArr (arr, step) {
	if (arr.length <= 0) {
		return arr
	}
	let count = step % arr.length
	return arr.splice(-count).concat(arr)
}

5SSS avatar May 23 '19 07:05 5SSS

function Test(a, k){ k = k % a.length; do{ TransformUnit(a); k--; }while(k>0) return a; }

function TransformUnit(a){ var first = a[0]; for(var i=0; i<a.length - 1; i++){ a[i] = a[i+1]; } a[a.length - 1] = first; return a; } console.error(Test([1,2,3,4,5,6,7], 7));

FounderIsShadowWalker avatar May 24 '19 03:05 FounderIsShadowWalker

const moveArr = (arr, k) => {
    const arrLeft = arr.splice(arr.length - k, k);
    return arrLeft.concat(arr);
};

moveArr([1, 2, 3, 4, 5, 6, 7], 1); // [7, 1, 2, 3, 4, 5, 6]
moveArr([-1, -100, 3, 99], 2); // [3, 99, -1, -100]

Tsionhe avatar May 24 '19 07:05 Tsionhe

var arr = [-1, -100, 3, 99];
var k = 5;

for (let i = 0; i < k; i++) {
	let val = arr.pop();
	arr.unshift(val);
}

console.log(arr);

如果移动步数大于数组长度的话可能会重复

rocky-191 avatar May 25 '19 08:05 rocky-191

let rotArr = (arr,k) => { let len = arr.length return [...arr,..arr].slice(k,len+k) }

这里应该是return [...arr,...arr].slice(len-k%len, len * 2 - k%len)吧

arieltlm avatar May 29 '19 07:05 arieltlm

var arr = [1,2,3,4,5,6,7,8,9];
function arrMoveStep(arr, k) {
  const len  = arr.length;
  let copyArr = JSON.parse(JSON.stringify(arr))
  return [...copyArr.splice(len - (k % len) , len),...copyArr]
}
console.log(arr)//[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
console.log(arrMoveStep(arr, 14))//[ 5, 6, 7, 8, 9, 1, 2, 3, 4 ]
console.log(arrMoveStep(arr, 7))//[ 3, 4, 5, 6, 7, 8, 9, 1, 2 ]

DWNEWS-jixiaohong avatar May 30 '19 05:05 DWNEWS-jixiaohong

function rotate(arr, k) {
  arr.unshift(...arr.splice(arr.length - k, k));
  return arr;
}

Caitingwei avatar Jun 09 '19 13:06 Caitingwei

const rotate = (arr, step) => {
  let len = arr.length;
  return arr.reduce((acc, v, i) => {
    return i + step >= len
      ? ((acc[i + step - len] = v), acc)
      : ((acc[i + step] = v), acc);
  }, []);
};

rotate([-1, -100, 3, 99] , 2);  // [3, 99, -1, -100]

B2D1 avatar Jun 20 '19 05:06 B2D1

function rotateArr( arr, k ) {   for( let i = 0; i < k; i++) {     arr.unshift( arr.pop() )   }   return arr; }

ckjie avatar Jun 24 '19 12:06 ckjie


//  the first solution,利用映射
const rotateArray0 = (arr, size) => arr.map((item, index) => arr[ (index - size + arr.length ) % arr.length]);

console.log(rotateArray0([1, 2, 3, 4, 5, 6], 3));

//  the second solution 利用splice

const rotateArray = (arr, size) => [...arr.splice(size % arr.length), ...arr];

console.log(rotateArray([1, 2, 3, 4, 5, 6], 3));

dorseysen avatar Jun 27 '19 09:06 dorseysen

// splice const rotateArray = (arr, k) => arr.splice(arr.length - k).concat(arr);

yangxy6 avatar Jul 09 '19 02:07 yangxy6

const arr = [1, 2, 3, 4, 5, 6, 7];
const k = 3;
console.log(
      Array.from({length:arr.length},(x,i)=>arr[(i+k+arr.length%2)%arr.length])
)

yucopowo avatar Jul 09 '19 11:07 yucopowo

    var arr = [1, 2, 3, 4, 5, 6, 7];

    function reverse(arr,k){
        k = k % arr.length;
        while(k--){
            arr.unshift(arr.pop());
        }
    }

    reverse(arr,3);
    console.log(arr);

linlinyang avatar Jul 15 '19 02:07 linlinyang

function rotate(arr,k){ while(k){ arr.unshift(arr.pop()); k--; } return arr; }

LINNO1 avatar Jul 15 '19 11:07 LINNO1

function move (attr,num) {
  let oldAttr=[];
  if(Array.isArray(attr) && typeof(num)==='number'&&num>-1){
    attr.map((v,i)=>{
      if(i+num>=attr.length)  num-=attr.length
        oldAttr.splice(i+num, 0, v);
    })
    return oldAttr
  }else{
    throw  new Error('请输入数组及大于-1的数字')
  }

}

NANAYWY avatar Jul 22 '19 10:07 NANAYWY

function rotateArr(arr, k) {
    const temp = [];
    for(let i=0; i<k; i++) {
        temp.push(arr.pop());
    }
    return [...temp, ...arr]
}

AchillesV avatar Jul 22 '19 14:07 AchillesV

leetcode原题,以下是参考答案:

var rotate = function(nums, k) {
  // 就像扩容一样操作
  k = k % nums.length;
  const n = nums.length;

  for (let i = nums.length - 1; i >= 0; i--) {
    nums[i + k] = nums[i];
  }

  for (let i = 0; i < k; i++) {
    nums[i] = nums[n + i];
  }
  nums.length = n;
};

如果你对数据结构和算法感兴趣,欢迎关注我的leetcode题解

azl397985856 avatar Jul 27 '19 07:07 azl397985856

   function rotate (arr, k) {
     for (let index = 0; index < k; index++) {
       const item = arr.pop()
       arr.unshift(item)
     }
    return arr
   }

   console.log(rotate([1, 2, 3, 4, 5, 6, 7], 3))

dengshangli avatar Jul 30 '19 03:07 dengshangli

function rotate(arr, k) {
  if (!arr) throw Error('requires an array')
  if (!k || k < 0) return arr

  let n = k % arr.length
  let stack = [].concat(arr)

  let index = 1

  while (n) {
    stack.unshift(stack.pop())
    n--
    console.log(`向右旋转 ${index++} 步`, stack);
  }

  return stack
}

console.log(rotate([1, 2, 3, 4, 5, 6, 7], 3))
console.log(rotate([-1, -100, 3, 99], 2))
console.log(rotate([1, 2], 13))
console.log(rotate([1, 2], -1))
console.log(rotate([1, 2, 3, 4, 5, 6, 7]))
console.log(rotate([]))

Mrlhz avatar Jul 31 '19 01:07 Mrlhz

function move(arr, step) {
  let length = arr.length;
  let hash = arr.reduce((hash, value, key) => {
    hash[key] = value;
    return hash;
  }, {});
  let newHash = Object.keys(hash).reduce((newHash, key) => {
    key = Number(key);
    let newKey = key + step > length - 1 ?  key + step - length : key + step;
    newHash[newKey] = hash[key]; 
    return newHash;
  }, {})
  return Array.from({...newHash, length})
}
用了一个很蠢的方式

cheungzh avatar Aug 01 '19 08:08 cheungzh

const rightMove = (arr: Array<number>, step: number) => {
    while (step > 0) {
        arr.unshift(arr.pop());
        step--;
    }
    return arr;
};
console.log(leftMove([1, 2, 3, 4, 5, 6, 7], 3));
console.log(leftMove([-1, -100, 3, 99], 2));

image

montage-f avatar Aug 02 '19 09:08 montage-f

let arr = [1, 2, 3, 5, 4, -12, -23, 56];

    function rotateArr(arr, k) {
        if (k <= 0) {
            return arr;
        }
        for (let i = 1; i <= k; i++) {
            const last = arr[arr.length - 1];
            arr.pop();
            arr.unshift(last)
        }
        return arr
    }

    rotateArr(arr, 3)

yangxinSamsara avatar Aug 14 '19 04:08 yangxinSamsara

function rotate(arr, k) { let list = arr.slice(0); list.reduce((target, cur, curIndex, arr)) { target[(curIndex + k) % arr.length] = cur; return target; }, arr) ; }

mao-th avatar Aug 15 '19 11:08 mao-th

因为步数有可能大于数组长度,所以要先取余

function  rotate(arr,k){
   const  len  =  arr。length 
  const  step  = k % len
   return  arr。切片(-步骤)。concat(arr。切片(0,len - step))
}
// rotate([1,2,3,4,5,6],7)=> [6,1,2,3,4,5]

let arrd= [1, 2, 3, 4, 5, 6, 7]; function rotate(arr, k) { const len = arr.length const step = k % len console.log(step); return arr.slice(-step).concat(arr.slice(0, len - step)) } console.log(rotate(arrd,7)); //[1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7] 当k等于数组长度就尴尬了 改成 const step = k % len||len;

1045598742 avatar Aug 15 '19 12:08 1045598742

    let arr = [-1, -100, 3, 99];
    let k = 2;
    let test = (array, key) => [...array.splice(-key), ...array];
    console.log(test([...arr], k));

zjkblade avatar Aug 20 '19 10:08 zjkblade

/**

  • 旋转数组
  • 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数 */

const reverseArr = (arr, k) => { if (arr.length < k) return const newarr = arr.splice(arr.length - k, k) console.log([...newarr, ...arr]) } reverseArr([1, 2, 3, 4, 5, 6, 7], 3)

image

tengwei30 avatar Aug 20 '19 14:08 tengwei30

上面大部分答案是splice截取再添加,我这里提供另外一种算法:

  • 只是将原数组index移动key个位置即可,超出数组长度,依次添加在数组头部,相当于固定位数的链表循环
function transformArr(arr, key){
    let resArr = [];
    arr.forEach((item, i) => {
        resArr[i] = i - key >= 0 ? arr[i - key] : arr[arr.length - key + i]
    });

    return resArr;
}

lvzhiyi avatar Aug 22 '19 09:08 lvzhiyi

var arr=[1,2,3,4,5,6,7];
var k=3;

var length=arr.length;
var moveCount=Math.abs(k%length);
console.log(moveCount)
if(moveCount>0){
	for(let i=0;i<moveCount;i++){
		let v=arr.splice(length-1,1);
		console.log(v)
		arr.unshift(...v)
	}
}
console.log(arr);

daiyunchao avatar Aug 23 '19 09:08 daiyunchao

leetcode初级算法数组原题 原地修改,可以这样: 1.reverse原数组 [ 1,2,3,4,5,6,7 ]===>[ 7,6,5,4,3,2,1 ] 2.reverse前k项 (k=2) [ 7,6,5,4,3,2,1 ]===>[ 6,7,5,4,3,2,1 ] 3.reverse剩余项 [ 6,7,5,4,3,2,1 ]===>[ 6,7,1,2,3,4,5]

DarthVaderrr avatar Aug 26 '19 03:08 DarthVaderrr

let arr = [1, 2, 3, 4, 5, 6, 7]; function handleArr(arr,k){ while(k--){ arr.unshift(arr.pop()) } return arr } let newArr = handleArr(arr,2) console.log(newArr)

weiweiwu01 avatar Aug 26 '19 09:08 weiweiwu01

function turnArr(arr,num){ let arrlen = arr.length; if(arrlen < num) return -1; var newArr = []; for(var i=0;i<arrlen;i++){ if((i+num)<arrlen){ newArr[i+num] = arr[i] }else{ var xiabiao = (i+num)%arrlen newArr[xiabiao] = arr[i] } } return newArr }

tumimowei avatar Aug 28 '19 03:08 tumimowei

function circleArr(arr,step){
    const storeArr = []
    storeArr[0] = arr.splice(-1 * step)
    storeArr[1] = arr
    return storeArr.flat(1)
}

yuwanli avatar Aug 31 '19 08:08 yuwanli

arr.map((a, index) => arr[(index - k % arr.length + arr.length) % arr.length])

tzh11 avatar Sep 02 '19 06:09 tzh11

let arr = [1, 2, 3, 4, "5", "6"];

const step = 2 % arr.length; // 避免步长超过数组大小

let sliceArr = arr.slice(0, arr.length - step);

let spliceArr = [].splice.bind(sliceArr, 0, 0);

spliceArr.apply(this, arr.slice(-step));

console.log(sliceArr); // [ '5', '6', 1, 2, 3, 4 ]

tianjucun avatar Sep 03 '19 10:09 tianjucun

function fn(arr, k){ const r = k % arr.length return arr.concat(arr.splice(0, r+1)) }

mrhuang2365 avatar Sep 06 '19 02:09 mrhuang2365

function rotateArr(arr, k) { let temp=arr.splice(-k); temp.push(...arr); return temp; }

zhangyuanze avatar Sep 09 '19 07:09 zhangyuanze

function rotate(arr, k) {
  Array.from({ length: k }).map(() => arr.unshift(arr.pop()));
  return arr;
}
rotate(arr, k);

yaodongyi avatar Sep 10 '19 10:09 yaodongyi

in-place 的解法来一波,不包含unshift/pop等数组的操作,先计算每一项在移动之后应该在的位置,然后依次赋值

let arr = [1,2,3,4,5];
function rotate (array, k){
  a = [...array];
  k = k % 5;
  for(let i=0;i<a.length;i++){
    array[i] = a[(i+a.length-k)%a.length];
  }
}
rotate(arr, 1);

lzxxxxx avatar Oct 10 '19 06:10 lzxxxxx

console.log([...abc.splice(abc.length-(k % abc.length)),...abc])

xuyaodegithub avatar Oct 14 '19 02:10 xuyaodegithub

咋一看是对的。。实际上是错的。

    function rotate(arr, num) {
        return arr.splice(arr.length - num).concat(...arr)
      }

看了大家的回答才知道,因为移动的距离是可能大于数组的长度的。。。。

      function rotate(arr, num) {
        return arr.splice(arr.length - (num % arr.length) ).concat(...arr)
      }

上面还有位大兄弟的做法很赞,每次pop然后unshift到最前面。仍然需要求余数!!!!!!!

      function rotate(arr, num) {
        for (let i = 0, j = num % arr.length; i < j; i++) {
          arr.unshift(arr.pop())
        }
        return arr
      } 

aeolusheath avatar Oct 16 '19 09:10 aeolusheath

for(let i=0;i<k;i++){
    arr.unshift(arr.pop())
}

YeahPotato avatar Oct 17 '19 09:10 YeahPotato

function fn(arr,k){
	let temp = arr.splice(arr.length - k,arr.length)
	let result = [...temp,...arr]
	return result
}
fn(arr,2)

小白问一下代码怎么高亮啊

Wuxiaa avatar Oct 31 '19 10:10 Wuxiaa

function rotate(a, k) {
    k %= a.length;
    let pre = a.splice(0, k + 1);
    return a.concat(pre);
}

Fzzzzy avatar Nov 02 '19 08:11 Fzzzzy

一行代码解决:

function rotate(arr, k) {
	return [...arr.splice(arr.length-k, k), ...arr]
}

tywei90 avatar Nov 03 '19 10:11 tywei90

function rotate(arr, k) { return arr.splice(arr.length - k).concat(arr) }

DavidChen93 avatar Nov 08 '19 03:11 DavidChen93

function rotate(arr, step) {
    var _arr = arr.slice()
    while (step--) {
        _arr.unshift(_arr.pop())
    }
    return _arr
}

huangjieqiu avatar Nov 11 '19 01:11 huangjieqiu

let arr =[1, 2, 3, 4, 5, 6, 7]; function reverse(arr,k) { while (k) { arr = [arr.pop()].concat(arr); k--; } return arr; }

reverse(arr,3);

772658652 avatar Nov 13 '19 16:11 772658652

function rotate(arr, k) {
  const len = arr.length
  const step = k % len
  return [...arr.slice(-step),...arr.slice(0, len - step)] ;
}
// rotate([1, 2, 3, 4, 5, 6], 7)
// [6, 1, 2, 3, 4, 5]

libin1991 avatar Nov 19 '19 09:11 libin1991

来一个普普通通的

 let As = [1, 2, 3, 4, 5, 6, 7]
  let k = 3
  let newArry = []
  let oldArry = []
  for (let i = 1; i < (As.length - k); i++) {
    newArry.push(As[i + k])
  }
  for (let i = 0; i <= k; i++) {
    oldArry.push(As[i])
  }
  console.log([...newArry, ...oldArry])

zhouqj1414657557 avatar Nov 19 '19 09:11 zhouqj1414657557

var arr = [1, 2, 3, 4, 5, 6, 7]; var k = 3; rotate(arr,k)

function rotate(arr,k){ for (var i = 0; i < k; i++) { if(k>arr .length) return for (var j = 0; j < arr.length; j++) { if (j == arr.length - 1) { var tempItem = arr.splice(j, 1); arr.unshift(tempItem[0]); } } } } console.log(arr);

xl-wolf avatar Nov 29 '19 03:11 xl-wolf

const arr = [1, 2, 3, 4, 5, 6, 7] function rotate(arr, k) { while (k) { k-- && arr.unshift(arr.pop()) } console.log(arr) } rotate(arr, 8) 这样不就好了?

lanOrage avatar Dec 02 '19 14:12 lanOrage

function stackWheel(arr , len){ return arr.splice(-len,len).concat(arr); }

xiaoang avatar Dec 09 '19 07:12 xiaoang

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

yygmind avatar Dec 16 '19 03:12 yygmind

let rotateArr = (arr, num) => { const len = arr.length; const step = num % len; for (let index = 0; index < step; index++) { let item = arr.pop(); arr.unshift(item); return arr; } }; rotateArr([5, 4, 3, 3, 2, 1], 6);

lakalakaka avatar Jan 03 '20 03:01 lakalakaka

function rotateArray(arr, k) {
  let front = arr.slice(0, arr.length - k)
  let rear = arr.slice(arr.length - k, arr.length)
  let result = rear.concat(front)
  return result
}

// let arr = [1, 2, 3, 4, 5, 6, 7]
let arr = [-1, -100, 3, 99]

console.log(rotateArray(arr, 2))

litokele2018 avatar Mar 26 '20 02:03 litokele2018

看看大佬的 看看我的.... 流下了没有技术的眼泪 ....

function reversalArr(arr, frequency) {
  const newReversalArr = arr
  for (let index = 0; index < frequency; index++) {
    var first = newReversalArr.splice(newReversalArr.length - 1,1)
    newReversalArr.unshift(...first)
  }
  return newReversalArr
}

coveyz avatar Apr 22 '20 09:04 coveyz

var rotate = function(nums, k) {
  for (let i = 0; i < k; i++) {
    nums.unshift(nums.pop())
  }
}

YanceyOfficial avatar May 24 '20 14:05 YanceyOfficial

function moveArr(arr,k) {
  const start = arr.length - k
  return [...arr.slice(start), ...arr.slice(0,start)]
}

zhangpanfei avatar May 28 '20 07:05 zhangpanfei

k = k % a.length;
let b = [...a.slice(-1 * k), ...a.slice(0, -1 * k)]

hanzc0106 avatar Jun 11 '20 12:06 hanzc0106

function moveK(arr, k){
    const p = arr.slice(arr.length - k);
    arr.length = arr.length - k;
    arr.unshift(...p);
    return arr;

};
moveK([1, 2, 3, 4, 5, 6, 7], 3);  // [5, 6, 7, 1, 2, 3, 4]

jackchang2015 avatar Jun 15 '20 08:06 jackchang2015

function rotate (arr, k) {
  return arr.concat(arr.splice(0, arr.length - k % arr.length))
}
rotate([1, 2, 3, 4, 5, 6, 7], 3) // [5, 6, 7, 1, 2, 3, 4]

woolson avatar Jun 16 '20 08:06 woolson

image

alan1111 avatar Jun 30 '20 02:06 alan1111

个人觉得这道题考察的是: 基于传统数组的定义,如何以最小时间复杂度来实现该算法, 而不是直接调用各种Array的方法~,

下边是我的实现;

function transArray(arr, k) {
  k = k % arr.length;
  if (k === 0) {
    return;
  }
  const tmpArr = Array.from({length: k});
  const len = arr.length;
  for(let ind =1; ind <= len; ind++){
    if(ind<=k){
      tmpArr[k-ind] = arr[len-ind]
    } else {
      arr[len-ind+k] = arr[len-ind]
    }
  }
  for(let ind =0; ind < k; ind++){
    arr[ind] = tmpArr[ind]
  }
}


const arr = [1,2,3,4,5,6,7,8,9,10]

transArray(arr, 3);

console.log(arr);
//[8, 9, 10, 1, 2, 3, 4,  5, 6, 7]

weivea avatar Jul 23 '20 09:07 weivea

const rA = (arr, k) => {
let ln = arr.length;
let k1 = k % ln;
return arr.slice(ln - k1).concat(arr.slice(0, ln - k1));
};
rA([1, 2, 3, 4, 5, 6, 7], 3)  // [5, 6, 7, 1, 2, 3, 4]
//第二种
const rA = (arr, k) => {
    let ln = arr.length;
    let k1 = k % ln;
    Array.from({length:k1}).map( ()=> {arr.unshift(arr.pop())});
    return arr
};

jackchang2015 avatar Jul 27 '20 03:07 jackchang2015

array.splice(index,howmany,item1,.....,itemX)

index:从何处添加/删除元素。 howmany:删除多少个元素。 item1~X:添加的元素1~X。

splice函数返回被删除元素的数组,会改变原数组,最好先拷贝下来。

var arr = [1, 2, 3, 4, 5, 6, 7];
function test(arr, index) {
  var _copy = [...arr]
  return index > arr.length || index < 0 ? arr : _copy.splice(arr.length - index).concat(_copy)
};

RoeyXie avatar Jul 30 '20 15:07 RoeyXie


function round(arr=[],n){
    let cut = arr.splice(arr.length-n,n)
    let result = cut.concat(arr)
    return result
}

round([1, 2, 3, 4, 5, 6, 7],3)

fengfan0409 avatar Aug 24 '20 08:08 fengfan0409

/**
 * @param {Array} arr - 数组
 * @param {number} step - 向右旋转的步数
 * */

const arr = [1, 2, 3, 4, 5, 6, 7];
const step = 3;
const autoReserver = (arr, step) => {
  for (let i = 0; i < step; i++) {
    arr.unshift(arr.pop());
  }
  return arr;
};

console.log(autoReserver(arr, step));

promotion-xu avatar Aug 31 '20 06:08 promotion-xu