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

CoderByte SerialNumber序列号校验JS代码错误排查

SerialNumber 函数错误排查与修正

问题根因

你的代码返回错误结果的核心原因是组内数字和计算逻辑完全错误,同时存在部分校验规则缺失:

  • 计算第一组、第二组校验值时,直接对字符串类型的字符做+操作,得到的是三个字符拼接成的三位字符串,而非三个数字相加的和。比如测试用例114.568.112的第二组数字是5、6、8,正确求和结果是19(奇数,符合规则),但你的代码拼接得到字符串"568",隐式转数字后取模为0,被误判为不符合第二组和为奇数的规则,直接返回false。
  • 未校验英文句号的固定位置,只要字符串长度≥11就进入后续逻辑,无法识别分隔符错位的非法输入。
  • 仅排除了字符0,未对其他字母、特殊符号做非法校验。

修正方案

按照题目规则逐次做校验,避免字符串隐式转换带来的逻辑错误,修正后完整代码如下:

function SerialNumber(str) { 
  // 固定格式校验:3组3位数字+2个分隔点,总长度必须为11
  if (str.length !== 11) return "false";
  // 校验分隔点必须在索引3、索引7的位置
  if (str[3] !== '.' || str[7] !== '.') return "false";

  // 按分隔点切分三组
  const groups = str.split('.');
  // 转换每组字符为数字,同时校验字符范围为1-9
  const numGroups = groups.map(group => {
    return group.split('').map(char => {
      const num = Number(char);
      if (Number.isNaN(num) || num < 1 || num > 9) return null;
      return num;
    })
  });
  // 存在非法字符、或组长度不符合3位直接返回false
  if (numGroups.some(group => group.includes(null) || group.length !== 3)) {
    return "false";
  }

  // 校验第一组数字和为偶数
  const sumFirst = numGroups[0][0] + numGroups[0][1] + numGroups[0][2];
  if (sumFirst % 2 !== 0) return "false";

  // 校验第二组数字和为奇数
  const sumSecond = numGroups[1][0] + numGroups[1][1] + numGroups[1][2];
  if (sumSecond % 2 === 0) return "false";

  // 校验每组最后一位数字大于同组前两位
  for (const group of numGroups) {
    if (group[2] <= group[0] || group[2] <= group[1]) {
      return "false";
    }
  }

  return "true";
}

// 官方示例测试
console.log(SerialNumber("224.315.218"));  // 输出 "true"
console.log(SerialNumber("11.124.667"));   // 输出 "false"
console.log(SerialNumber("114.568.112"));  // 输出 "true"

修正点说明

  • 所有字符先显式转为数字类型后再做计算,彻底避免字符串拼接、隐式类型转换导致的逻辑错误。
  • 补全了分隔符位置、非法字符的校验,覆盖所有格式类规则。
  • 按题目规则顺序做校验,逻辑可读性更强,后续调整规则时修改成本更低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 23:27:31