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
相关产品推荐
相关产品推荐

