用循环合并两个排序'for'数组...如何在循环结束时阻止'i'增加



我想将两个排序数组合并为一个排序数组,例如 [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] 并且未定义在那里,因为第一个数组没有 5 的索引,所以它是未定义的......哎呀...我似乎无法得到这个:(

我真的很感激任何帮助,谢谢

你可以采取一些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]));

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

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

带有 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;
}

最新更新