3 回答
TA贡献1811条经验 获得超5个赞
你犯了两个错误。
在数组 not的while循环条件检查中。这不会添加两个数组的最后一个元素。lengthlength - 1
当数组之一由于&&. 所以在while之后添加其他数组的剩余元素。
function mergeSortedArrays(arr1, arr2) {
var i = 0;
var j = 0;
var arr3 = [];
if (arr1 === undefined || arr1.length == 0) {
return arr2;
}
if (arr2 === undefined || arr2.length == 0) {
return arr1;
}
while (i < arr1.length && j < arr2.length) {
if (arr1[i] < arr2[j]) {
arr3.push(arr1[i]);
i++;
} else {
arr3.push(arr2[j]);
j++;
}
}
if(i === arr1.length){
return arr3.concat(arr2.slice(j))
}
else if(j === arr2.length){
return arr3.concat(arr1.slice(i))
}
}
console.log(mergeSortedArrays([0, 3, 4, 31], [3, 4, 6, 30]));
TA贡献1805条经验 获得超10个赞
您的代码中缺少两件事:
while 循环为i < arr1.length - 1forarr1和j < arr2.length - 1for运行arr2。这意味着它将运行到 arr1 和 arr2 的第 3 个索引。所以最后一个索引不会在循环中执行。所以你应该像i < arr1.lengthforarr1和j < arr2.lengthfor一样重构循环arr2。
下一个缺少的东西,您需要为剩余数组的剩余元素添加循环。这意味着当您执行代码时,一个循环的所有元素将被推入,arr3然后另一个数组的一个元素将被遗漏,并且不会被推入arr3(对于两个数组的相同长度)和/或多个另一个数组的元素将被遗漏(对于两个数组的不同长度)。所以你需要将另一个数组的剩余元素推送到arr3.
我已经添加了你的代码的重构代码。
function mergeSortedArrays(arr1, arr2) {
var i = 0;
var j = 0;
var arr3 = [];
if (arr1 === undefined || arr1.length == 0) {
return arr2;
}
if (arr2 === undefined || arr2.length == 0) {
return arr1;
}
while (i < arr1.length && j < arr2.length) {
if (arr1[i] < arr2[j]) {
arr3.push(arr1[i]);
i++;
} else {
arr3.push(arr2[j]);
j++;
}
}
while (i < arr1.length) {
arr3.push(arr1[i]);
i++;
}
while (j < arr2.length) {
arr3.push(arr2[j]);
j++;
}
return arr3;
}
OR
您可以使用扩展运算符合并两个数组,然后您可以使用 JS 的排序方法。
function mergeTwo(arr1, arr2) {
let result = [...arr1, ...arr2];
return result.sort((a,b) => a-b);
}
添加回答
举报