为了账号安全,请及时绑定邮箱和手机立即绑定

Javascript,合并两个排序的数组:有人能告诉我为什么这没有给出正确的合并排序吗?

Javascript,合并两个排序的数组:有人能告诉我为什么这没有给出正确的合并排序吗?

千巷猫影 2021-10-21 17:12:52
我尝试合并两个数组,但得到的输出是 [ 0, 3, 3, 4, 4 ]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 - 1 && j < arr2.length - 1) {    if (arr1[i] < arr2[j]) {      arr3.push(arr1[i]);      i++;    } else {      arr3.push(arr2[j]);      j++;    }  }  return arr3;}console.log(mergeSortedArrays([0, 3, 4, 31], [3, 4, 6, 30]));对于这个例子,我知道我没有考虑数组大小不同的情况,但这是为了以后的问题。该代码目前甚至不适用于基本情况。它不会一直迭代并在中途中断。有人可以解决这个问题。我已经解决了 while 循环,但代码仍然不起作用。
查看完整描述

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


查看完整回答
反对 回复 2021-10-21
?
holdtom

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

}


查看完整回答
反对 回复 2021-10-21
  • 3 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信