如何按索引最优合并数组?指定场景实现方案问询
按索引/规则最优合并数组的两种场景解决方案
嘿,我来帮你搞定这个数组合并的问题!从你给出的两个例子来看,其实是两种不同的合并需求,我会分别给出最优时间复杂度的实现方案,兼顾效率和可读性~
场景1:合并两个有序数组为一个有序数组
第一个例子里的数字数组都是有序的,合并后要保持整体有序,这种场景下最优的方法是双指针法,时间复杂度是O(m+n)(m、n分别是两个数组的长度),比先拼接再排序的O((m+n)log(m+n))高效得多。
实现代码(JavaScript)
function mergeSortedArrays(a, b) { const merged = []; let i = 0, j = 0; // 同时遍历两个数组,每次取较小的元素加入结果 while (i < a.length && j < b.length) { if (a[i] < b[j]) { merged.push(a[i]); i++; } else { merged.push(b[j]); j++; } } // 把剩下的元素直接追加(因为数组本身有序,剩下的肯定都比结果里的大) while (i < a.length) { merged.push(a[i]); i++; } while (j < b.length) { merged.push(b[j]); j++; } return merged; } // 测试示例 var a = [1, 3, 5, 7]; var b = [2, 4, 6]; var c = mergeSortedArrays(a,b); console.log(c); // 输出: [1, 2, 3, 4, 5, 6, 7]
场景2:按索引交替合并数组
第二个例子是按索引交替取元素,也就是先取a[0],再取b[0],接着a[1],b[1]...直到其中一个数组遍历完,再把剩下的元素全部追加到结果里。这种场景的最优解法是遍历到两个数组中长度较大的那个的长度,逐个处理每个索引的元素,时间复杂度是O(max(m,n))。
实现代码(JavaScript)
function mergeAlternately(a, b) { const merged = []; const maxLength = Math.max(a.length, b.length); for (let k = 0; k < maxLength; k++) { // 如果当前索引在a的范围内,就加入a的元素 if (k < a.length) { merged.push(a[k]); } // 如果当前索引在b的范围内,就加入b的元素 if (k < b.length) { merged.push(b[k]); } } return merged; } // 测试示例 var a = ["string1", "string2"]; var b = ["string3"]; var c = mergeAlternately(a,b); console.log(c); // 输出: ["string1", "string3", "string2"]
补充说明
如果你的需求是要根据数组类型自动判断用哪种合并方式(比如数字数组用有序合并,其他用交替合并),可以在函数里加个类型判断逻辑,比如检查数组元素是否都是数字:
function merge(a, b) { // 判断是否都是数字数组 const isNumericArray = (arr) => arr.every(item => typeof item === 'number'); if (isNumericArray(a) && isNumericArray(b)) { return mergeSortedArrays(a, b); } else { return mergeAlternately(a, b); } }
内容的提问来源于stack exchange,提问作者user3055938
相关产品推荐
相关产品推荐

