【问题标题】:Merging two sorted arrays with 'for' loop... how to stop 'i' from increasing at end of loop用'for'循环合并两个排序数组......如何阻止'i'在循环结束时增加
【发布时间】:2019-09-08 00:48:17
【问题描述】:

我想将两个排序数组合并为一个排序数组,例如[1, 3, 6, 7, 11] 和 [2, 3, 5, 8, 9, 10] 合并成为 [1, 2, 3, 3, 5, 6, 7, 8, 9, 10, 11 ]。但是,我想在没有任何 JavaScript 数组方法(如 .push() 或 .concat() )的情况下执行此操作,因此我更加熟悉这些方法中的底层逻辑。这是我的代码。

const array1 = [1, 3, 6, 7, 11];
const array2 = [2, 3, 5, 8, 9, 10];

const set = (arr, index, value) => {
  return arr[index] = value;
}

const mergeArrs = (arr1, arr2) => {
  let loopLength = arr1.length >= arr2.length ? arr1.length : 
  arr2.length;
  let mergedArr = [];
  for (let i = 0; i < loopLength; i++) {
    if (arr1[i] <= arr2[i]) {
      console.log(i);
      mergedArr = [...mergedArr, set(mergedArr, i, arr1[i]), set(mergedArr, i + 1, arr2[i])];
    } else {
      console.log(i);
      mergedArr = [...mergedArr, set(mergedArr, i, arr2[i]), set(mergedArr, i + 1, arr1[i])];
    }
  }
  return mergedArr;
}

mergeArrs(array1, array2);

这是控制台的输出:

0
1
2
3
4
5
=> [ 1, 2, 3, 3, 5, 6, 7, 8, 9, 11, 10, undefined ]

我认为我的函数的某些部分是正确的,但是我遇到了诸如数组仅相对于其原始位置进行合并/排序的问题。例如。 arrayOne[4] = 11 和 arrayTwo[4] = 9,所以一开始,它是正确的 [..., 9, 11, ...] 但是因为 arrayOne 没有索引 5 而 arrayTwo 有, arrayTwo[5] = 10,10 在 11: [..., 9, 11, 10, undefined] 之后附加到数组上,并且 undefined 在那里,因为第一个数组没有索引 5 所以它是未定义... idk...我似乎无法得到这个:(

非常感谢任何帮助,谢谢

【问题讨论】:

  • 请注意,使用 [2, 3, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15] 和 [1, 4, 9, 16, 25] 等值,您需要两个独立的指示,即使在到达任一数组的末尾之前,每个数组的处理量也是如此。

标签: javascript arrays algorithm loops


【解决方案1】:

您可以使用一些 while 循环,因为您可以独立检查索引并根据需要推送值,并为推送的值增加索引。

第一个while 循环检查两个索引并包含一个检查以获得较小的值。

另外两个while 循环对于将剩余值添加到merged 数组是必需的。

var array1 = [1, 3, 6, 7, 11],
    array2 = [2, 3, 5, 8, 9, 10],
    merged = [],
    i = 0,
    j = 0;

while (i < array1.length && j < array2.length) {
    if (array1[i] < array2[j]) {
        merged = [...merged, array1[i++]];
        continue;
    }
    merged = [...merged, array2[j++]];
}

while (i < array1.length) merged = [...merged, array1[i++]];
while (j < array2.length) merged = [...merged, array2[j++]];

console.log(...merged);

另一种方法

function merge([v, ...a], [w, ...b]) {
    return v < w
        ? [v, ...(a.length ? merge(a, [w, ...b]) : [w, ...b])]
        : [w, ...(b.length ? merge([v, ...a], b) : [v, ...a])];
}

console.log(...merge([1, 3, 6, 7, 11], [2, 3, 5, 8, 9, 10]));

【讨论】:

    【解决方案2】:

    对您的代码进行了一些更改,它现在可以工作了。

    const array1 = [1, 3, 6, 7, 11];
        const array2 = [2, 3, 5, 8, 9, 10];
    
        const set = (arr, index, value) => {
            return arr[index] = value;
        }
    
        const mergeArrs = (arr1, arr2) => {
            let loopLength = arr1.length + arr2.length;
            let mergedArr = [];
            for (let i = 0; i <= loopLength; i++) {
                if (arr1.length && arr2.length) {
                    if (arr1[0] <= arr2[0])
                        mergedArr = [...mergedArr, set(mergedArr, i, arr1.shift())];
    
                    else
                        mergedArr = [...mergedArr, set(mergedArr, i, arr2.shift())];
                }
                else if (arr1.length) {
                    mergedArr = [...mergedArr, set(mergedArr, i, arr1.shift())];
                }
                else if (arr2.length) {
                    mergedArr = [...mergedArr, set(mergedArr, i, arr2.shift())];
                }
            }
            return mergedArr;
        }
    
        console.log(mergeArrs(array1, array2));

    【讨论】:

      【解决方案3】:

      带有while循环的东西可以完成这项工作。只要数组不为空,您只需比较每个较小的元素。然后你增加正确的索引(包含所选值的数组之一),保持另一个不变。

      function mergeArrs(arr1, arr2) {
          let i = 0,
              j = 0,
              k = 0,
              mergedArr = [];
      
          //compare as long as they're not empty
          while (i != arr1.length && j != arr2.length) {
              if (arr1[i] > arr2[j])
                  mergedArr[k++] = arr2[j++];
              else
                  mergedArr[k++] = arr1[i++];
          }
          // empty the remainder
          while (i < arr1.length)
              mergedArr[k++] = arr1[i++];
          while (j < arr2.length)
              mergedArr[k++] = arr2[j++];
          return mergedArr;
      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-28
        • 1970-01-01
        • 1970-01-01
        • 2018-09-15
        • 2021-09-15
        • 1970-01-01
        • 1970-01-01
        • 2014-03-22
        相关资源
        最近更新 更多