You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何匹配两个整数数组:将小数组扩展至大数组长度并匹配最近邻

实现数组扩展的最近邻匹配逻辑(优先左侧)

针对你提出的数组扩展需求,我来分享一个清晰的实现思路和代码示例,完全贴合你给出的规则:


核心规则回顾

先明确咱们要严格遵守的规则,避免踩坑:

  • 把小数组扩展到大数组的长度,最终数组的元素只能来自小数组(不能生成原数组没有的值,比如invalid_expanded_b2里的15000就是违规的)
  • 匹配逻辑:对大数组的每个元素,找小数组中最近的左侧元素(即小于等于当前元素的最大元素);如果当前元素比小数组所有元素都小,就取小数组第一个元素;如果比所有元素都大,取最后一个元素

实现思路(以JavaScript为例)

我们可以封装一个通用函数,步骤如下:

  1. 先确认哪个是源数组(需要扩展的小数组)和目标数组(作为长度模板的大数组)
  2. 对目标数组的每个元素,执行查找:
    • 遍历源数组(或者用更高效的二分查找,适合大数组),找到第一个大于当前元素的位置,它的前一个元素就是我们要的左侧最近邻
    • 处理边界:当前元素小于源数组第一个元素 → 取第一个元素;大于等于最后一个 → 取最后一个
  3. 收集所有匹配结果,返回扩展后的数组

代码实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:17:29