如何高效实现多数组垂直遍历并生成目标输出序列?
如何按垂直方向合并多个数组元素?
嘿,这个按垂直方向取数组元素的需求很实用,我来给你拆解下最有效的实现思路和代码~
先明确下需求:我们有三个数组
array1 = [1,2,3,4]; array2 = [5,6,7]; array3 = [8,9,10,11];
需要生成输出序列:1,5,8,2,6,9,3,7,10,4,11,对应垂直方向的取数逻辑就像下面这个表格展示的:
| 数组1 | 数组2 | 数组3 |
|---|---|---|
| 1 | 5 | 8 |
| 2 | 6 | 9 |
| 3 | 7 | 10 |
| 4 | 11 |
核心实现思路
最直接高效的方式就是按索引遍历,逐行收集元素:
- 先找到所有数组里最长的那个的长度,这是我们需要遍历的总次数
- 从索引0开始,依次检查每个数组在当前索引是否有元素,有就加入结果集合
- 最后把结果集合转成你需要的字符串格式
具体代码实现(JavaScript)
针对固定3个数组的版本
const array1 = [1,2,3,4]; const array2 = [5,6,7]; const array3 = [8,9,10,11]; // 第一步:获取最长数组的长度 const maxLength = Math.max(array1.length, array2.length, array3.length); const result = []; // 第二步:按索引遍历,逐个收集元素 for (let i = 0; i < maxLength; i++) { if (i < array1.length) result.push(array1[i]); if (i < array2.length) result.push(array2[i]); if (i < array3.length) result.push(array3[i]); } // 第三步:转成目标字符串格式 const output = result.join(','); console.log(output); // 输出:1,5,8,2,6,9,3,7,10,4,11
支持任意数量数组的通用版本
如果以后需要处理更多数组,这个版本更灵活:
// 把所有数组放到一个集合里 const arrays = [[1,2,3,4], [5,6,7], [8,9,10,11]]; // 获取最长数组的长度 const maxLength = Math.max(...arrays.map(arr => arr.length)); const result = []; // 遍历每个索引,再遍历每个数组收集元素 for (let i = 0; i < maxLength; i++) { arrays.forEach(arr => { if (i < arr.length) result.push(arr[i]); }); } console.log(result.join(',')); // 同样输出目标序列
为什么这个方式高效?
- 时间复杂度最优:是
O(n*m),其中n是最长数组的长度,m是数组的个数。因为我们必须遍历每个元素至少一次,这已经是理论上的最小复杂度了。 - 空间复杂度可控:只需要一个结果数组来存储所有元素,空间复杂度是
O(k)(k是所有元素的总个数),没有额外的冗余开销。
内容的提问来源于stack exchange,提问作者Daniel O Mensah
相关产品推荐
相关产品推荐

