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

如何从含分隔符的多国邮政编码中推断数值范围,无需移除重加分隔符?

多国邮政编码区间提取优化问题

现有存储多国邮政编码的数组,格式示例如下:
["100-1001","102-1000","102-1001","102-1002","100-1002","111","112","102-1003","113"]
需要将这些邮编推断为连续区间,输出格式为[[upper1,lower1],[upper2,lower2]],上述示例对应的输出应为:
[["100-1001","100-1002"],["102-1000","102-1003"],["111","113"]]

现有实现逻辑

目前的方案是先移除所有分隔符转为纯数字,推断区间后再重新添加分隔符,已实现的无连字符邮政编码范围提取代码如下:

getRanges(zipCodes) {
  zipCodes.sort();
  let length = 1;
  let ranges = [];
  for (let i = 1; i <= zipCodes.length; i++) {
    if (i == zipCodes.length || zipCodes[i] - zipCodes[i - 1] != 1) {
      if (length == 1) {
        let upper = lower = zipCodes[i - length];
        ranges.push({lower, upper});
      }
      else {
        let lower = zipCodes[i - length];
        let upper = zipCodes[i - 1];
        ranges.push({lower, upper});
      }
      length = 1;
    }
    else {
      length++;
    }
  }
  return ranges;
}

现在想要避免移除再重加分隔符的额外开销,求更优的区间解析方法。


优化方案

完全可以避免拆分重拼分隔符的开销,核心思路是写一个专用的相邻邮编连续性判断函数,直接对原始带格式的字符串做判断,不需要转换为纯数字,调整后的逻辑如下:

  1. 先对原始邮编数组做字典序排序(绝大多数国家的带分隔符邮编字典序和数值序完全一致,匹配你示例的场景)
  2. 遍历过程中直接调用连续性判断函数,判断当前邮编和上一个邮编是否连续
  3. 直接用原始字符串拼接最终的区间结果,不需要做任何格式转换

实现代码

// 辅助函数:判断两个邮编是否连续
function isZipConsecutive(prev, curr) {
  // 先判断两个邮编的格式(长度、是否带连字符)是否一致,格式不同直接不连续
  if (prev.length !== curr.length || prev.includes('-') !== curr.includes('-')) {
    return false
  }
  // 无连字符的场景直接转数字判断差值
  if (!prev.includes('-')) {
    return Number(curr) - Number(prev) === 1
  }
  // 有连字符的场景先拆分前后段,判断前缀是否相同
  const [prevPrefix, prevSuffix] = prev.split('-')
  const [currPrefix, currSuffix] = curr.split('-')
  if (prevPrefix !== currPrefix) {
    return false
  }
  // 前缀相同的情况下判断后缀差值是否为1
  return Number(currSuffix) - Number(prevSuffix) === 1
}

// 优化后的区间提取函数
function getZipRanges(zipCodes) {
  // 拷贝数组后按原始字符串字典序排序,避免修改原数组
  const sorted = [...zipCodes].sort()
  const ranges = []
  let currentStart = sorted[0]
  for (let i = 1; i < sorted.length; i++) {
    if (!isZipConsecutive(sorted[i-1], sorted[i])) {
      // 不连续就闭合上一个区间
      ranges.push([currentStart, sorted[i-1]])
      currentStart = sorted[i]
    }
  }
  // 闭合最后一个区间
  ranges.push([currentStart, sorted[sorted.length - 1]])
  return ranges
}

方案优势

  • 全程不需要修改原始邮编的格式,避免了拆分、拼接分隔符的额外开销
  • 天然兼容带/不带连字符的多国邮编格式,匹配你处理多国邮编的需求
  • 代码逻辑更简洁,比原始实现少了格式转换的冗余步骤
  • 对示例输入直接测试,输出结果和需求完全一致

内容的提问来源于stack exchange,提问作者Tania

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:06:03