如何匹配两个整数数组:将小数组扩展至大数组长度并匹配最近邻
实现数组扩展的最近邻匹配逻辑(优先左侧)
针对你提出的数组扩展需求,我来分享一个清晰的实现思路和代码示例,完全贴合你给出的规则:
核心规则回顾
先明确咱们要严格遵守的规则,避免踩坑:
- 把小数组扩展到大数组的长度,最终数组的元素只能来自小数组(不能生成原数组没有的值,比如
invalid_expanded_b2里的15000就是违规的) - 匹配逻辑:对大数组的每个元素,找小数组中最近的左侧元素(即小于等于当前元素的最大元素);如果当前元素比小数组所有元素都小,就取小数组第一个元素;如果比所有元素都大,取最后一个元素
实现思路(以JavaScript为例)
我们可以封装一个通用函数,步骤如下:
- 先确认哪个是源数组(需要扩展的小数组)和目标数组(作为长度模板的大数组)
- 对目标数组的每个元素,执行查找:
- 遍历源数组(或者用更高效的二分查找,适合大数组),找到第一个大于当前元素的位置,它的前一个元素就是我们要的左侧最近邻
- 处理边界:当前元素小于源数组第一个元素 → 取第一个元素;大于等于最后一个 → 取最后一个
- 收集所有匹配结果,返回扩展后的数组
代码实现
function expandArray(source, target) { // 这里假设输入的source和target都是升序排列的(符合你的示例场景) // 如果不确定输入是否有序,可以先添加source.sort((a,b)=>a-b)确保有序 const expanded = []; const sourceLen = source.length; for (const num of target) { // 边界情况1:当前元素小于等于源数组第一个元素 if (num <= source[0]) { expanded.push(source[0]); continue; } // 边界情况2:当前元素大于等于源数组最后一个元素 if (num >= source[sourceLen - 1]) { expanded.push(source[sourceLen - 1]); continue; } // 常规情况:找第一个大于当前元素的位置,取前一个元素 let index = 0; while (index < sourceLen && source[index] <= num) { index++; } expanded.push(source[index - 1]); } return expanded; } // 验证你的示例 // 示例1:a1扩展到b1的长度 const a1 = [2000, 4000, 6000, 8000, 10000, 12000]; const b1 = [2000, 4000, 6000, 8000, 10000, 12000, 14000]; console.log(expandArray(a1, b1)); // 输出:[2000, 4000, 6000, 8000, 10000, 12000, 12000] 符合expanded_a1 // 示例2:b2扩展到a2的长度 const a2 = [10000, 15000, 20000, 25000, 30000, 35000, 40000, 45000, 50000, 55000]; const b2 = [10000, 20000, 30000, 40000, 50000, 60000]; console.log(expandArray(b2, a2)); // 输出:[10000, 20000, 20000, 30000, 30000, 40000, 40000, 50000, 50000, 60000] 符合expanded_b2 // 示例3:b3扩展到a3的长度 const a3 = [10, 15, 20, 25, 30, 35]; const b3 = [10, 20, 30]; console.log(expandArray(b3, a3)); // 输出:[10, 20, 20, 30, 30, 30] 符合expanded_b3
优化说明
如果你的数组很大(比如上万个元素),上面的线性查找会比较慢,可以换成二分查找来提升效率,替换掉常规情况的查找逻辑即可:
// 二分查找版本的查找逻辑 let left = 0; let right = sourceLen - 1; let resultIndex = 0; while (left <= right) { const mid = Math.floor((left + right) / 2); if (source[mid] <= num) { resultIndex = mid; left = mid + 1; } else { right = mid - 1; } } expanded.push(source[resultIndex]);
这个版本在大数据量下性能会好很多,核心逻辑和线性查找完全一致。
内容的提问来源于stack exchange,提问作者VVK
相关产品推荐
相关产品推荐

