Javascript 给定一个数组和正整数d,将数组有效左移d

Javascript 给定一个数组和正整数d,将数组有效左移d,javascript,algorithm,optimization,rotation,shift,Javascript,Algorithm,Optimization,Rotation,Shift,这是黑客银行的问题描述: 对大小为n的数组执行左旋转操作会将数组的每个元素d单元向左移动。例如,如果对数组[1,2,3,4,5]执行左旋转,则该数组将变为[3,4,5,1,2] 以下是我的功能: 函数左旋转(arr,d){ 设newArr=[]; 而(d>0){ let first=arr.shift(); 新推(第一); d--; } 返回[…arr,…newArr]; } log(leftRotation([1,2,3,4,5],2))不旋转N次。移位N%(数组长度)次,因为假设您有一个5

这是黑客银行的问题描述: 对大小为n的数组执行左旋转操作会将数组的每个元素d单元向左移动。例如,如果对数组[1,2,3,4,5]执行左旋转,则该数组将变为[3,4,5,1,2]

以下是我的功能:

函数左旋转(arr,d){
设newArr=[];
而(d>0){
let first=arr.shift();
新推(第一);
d--;
}
返回[…arr,…newArr];
}

log(leftRotation([1,2,3,4,5],2))
不旋转N次。移位
N%(数组长度)
次,因为假设您有一个
5
项的数组,并且要求您将其移位5次,那么您基本上不需要移位一次

Start : [1, 2, 3, 4, 5]
1: [2, 3, 4, 5, 1]
2: [3, 4, 5, 1, 2]
3: [4, 5, 1, 2, 3]
4: [5, 1, 2, 3, 4]
5: [1, 2, 3, 4, 5]
编辑:

您可以使用类似的逻辑来优化代码,而不是实际移动数组中的元素。例如:在
N=73000,D=60000
的情况下,您可以通过
73000%60000
拼接阵列,然后将返回的拼接阵列附加到现有阵列并返回它

  • 对于数组
    arr
    方法
    shift()
    的时间复杂度可能为
    O(arr.length)
  • 如果
    d
    大于
    n
    则仍然执行
    shift()
    d
  • 总的来说,您的时间复杂度可能会上升到
    O(d*arr.length)
    ,这肯定太长了
然而,这个问题可以在
O(arr.length)
时间和空间中解决。如果您知道
d
,则可以轻松地将每个项目向左移动
d
位置。例如,
arr.length=5
d=2

position:        0 1 2 3 4
     arr:        4 3 5 1 6              

position in arr: 2 3 4 0 1  
shifted_arr:     5 1 6 4 3                
因此,实际上,移位数组中位于
i
位置的每个项目对应于原始数组
arr
中位于
(i+d)%arr.length
位置的项目。因此,代码可以如下所示:

功能左移(arr,d){
设newArr=[];
让尺寸=arr.长度;
对于(变量i=0;ilog(leftShift([4,3,5,1,6,2])
我不能完全确定这个方法的性能,但它可以在一行中完成

函数左旋转(arr,d){
返回[…arr.slice(d),…arr.slice(0,d)];
}

log(leftRotation([1,2,3,4,5,2])谢谢你的帮助。我试过了,它不适用于大型测试用例