Javascript 给定一个数组和正整数d,将数组有效左移d
这是黑客银行的问题描述: 对大小为n的数组执行左旋转操作会将数组的每个元素d单元向左移动。例如,如果对数组[1,2,3,4,5]执行左旋转,则该数组将变为[3,4,5,1,2] 以下是我的功能: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
函数左旋转(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;i log(leftShift([4,3,5,1,6,2])
我不能完全确定这个方法的性能,但它可以在一行中完成
函数左旋转(arr,d){
返回[…arr.slice(d),…arr.slice(0,d)];
}
log(leftRotation([1,2,3,4,5,2])代码>谢谢你的帮助。我试过了,它不适用于大型测试用例