JavaScript查找字符串中字符a并按规则累加后续数值的实现方法
实现方案与代码调整说明
现有代码问题汇总
- 变量引用错误:函数入参命名为
a,但逻辑中读取了未定义的变量c,会直接触发运行时报错 - 变量未声明:累加器
ac没有使用let声明,会泄漏为全局变量,引发作用域污染 - 方法语义不符:
map是用于生成新数组的迭代方法,纯累加遍历场景用forEach更合适 - 缺少返回值:函数执行结束后没有返回累加结果,外部无法获取计算值
- 正则匹配不严谨:原正则没有加边界限制,可能出现3位字符中只有部分是数字就误判的情况
修正后的原生遍历实现
const sol = str => { let ac = 0; str.split('').forEach((char, index) => { if (char === 'a') { // 截取a之后的3位字符判断是否符合规则 const followStr = str.slice(index + 1, index + 4); if (/^\d{3}$/.test(followStr)) { ac += Number(followStr); } else { ac += 1; } } }); return ac; };
注:正则增加了首尾边界匹配^和$,确保截取的3位字符全部是数字才命中规则,避免部分匹配的逻辑错误
更简洁的全局正则匹配实现
直接通过正则批量匹配所有符合规则的a及后续内容,遍历匹配结果累加即可,性能更高、逻辑更清晰:
const sol = str => { let total = 0; // 匹配所有a,同时捕获后续的3位数字(如果存在的话) const matches = str.matchAll(/a(\d{3})?/g); for (const match of matches) { total += match[1] ? Number(match[1]) : 1; } return total; };
测试示例
比如输入a123~bba,计算逻辑:
- 第一个
a后接123,加123 - 第二个
a后接~,加1 - 最终结果为124,和预期一致
内容的提问来源于stack exchange,提问作者Any3nymous user
相关产品推荐
相关产品推荐

