【发布时间】:2022-01-23 12:01:18
【问题描述】:
我正在尝试就地反转 JS 中的数组(不使用额外的数组)。 我正在使用 split-merge recursive (我首先将数组分成两半,然后分别重新排列每一半,然后结合两种排列的结果)。 如果数组长度为奇数,则似乎会出现问题,在这种情况下,将存在一个包含单个项目的数组和另一个包含两个项目的数组。
例子:
reverseArrayInPlace([1, 5, 0, 4, 6]) 应该像这样工作:
1- reverseArrayInPlace([1,5,0]) -> 返回以下调用
- reverseArrayInPlace([1, 5]) -> 返回 [5, 1]
- reverseArrayInPlace([0]) -> 返回 [0]
现在应该合并和交换第一次调用的两个数组。结果应该是 [0,5,1]
2- reverseArrayInPlace([4, 6]) -> 返回 [6,4]
现在,调用 (1) 和调用 (2) 的结果必须合并和交换(也使用 concat); 这将使结果为:[6,4,0,5,1]。
我知道还有其他更简单的方法,但我想知道为什么我的代码没有返回正确的值。
let reverseArrayInPlace = ar => {
let splitArray = arr => {
if( arr.length === 1){
console.log('length = 1', arr);
return arr;
}
else if(arr.length === 2){
console.log('length = 2', arr);
let temp = arr[0]; arr[0] = arr[1]; arr[1] = temp;
return arr;
}
else{
reverseArrayInPlace(arr);
//reverseArrayInPlace (ar2);
}
}
let mergeArray = (arr1, arr2) => {
console.log("Swapping : ", arr1, arr2);
console.log('Concated : ',arr2.concat(arr1));
if(arr1 === undefined)
return arr2;
else if(arr2 === undefined)
return arr1;
else
return arr2.concat(arr1);
}
let half = Math.ceil(ar.length / 2);
//console.log('half = ', half);
ar1 = splitArray(ar.slice(0, half));
ar2 = splitArray(ar.slice(half));
//console.log(arr1, arr2);
return mergeArray(ar1, ar2);
}
let ar = [1, 5, 0, 4, 6];
console.log(reverseArrayInPlace(ar));
【问题讨论】:
-
array.slice(),array.concat()使用更多空间,因为返回一个新数组... -
我知道,但我在这里关心的是在代码中找到不会使递归过程得到正确结果的东西。
-
你知道有一个
reverse方法,对吧? -
是的,但是玩递归是一件非常美妙的事情。
标签: javascript algorithm