JavaScript实现HackerRank重复字符串挑战单个测试用例失败问题求解
代码错误定位
你的实现中唯一的逻辑bug出现在n能被s长度整除的分支判断里:
if (n % s.length === 0){ return count * n; }
此处的count是单个完整s中包含的字母a的数量,当n是s长度的整数倍时,实际拼接的完整s的个数是Math.trunc(n / s.length),正确的计算值应该是单串a的数量乘以完整重复次数,而非直接乘以总长度n。
这个错误刚好会把最终结果放大s.length倍:本次测试用例的s长度恰好是100,所以原本正确的结果51574523448被放大100倍,得到了错误输出5157452344800,和你看到的测试偏差完全吻合。
为什么之前19个测试用例都能通过?
因为这些用例要么触发了n < s.length的提前返回分支,没走到整除判断的错误逻辑;要么s的长度为1,此时count * n的计算结果和正确值刚好相等(因为重复次数等于n本身),所以没有暴露问题。
简化修正后的代码
去掉冗余的分支判断,所有场景统一用「完整重复次数*单串a数 + 剩余截断部分a数」的公式计算,彻底避免分支写错的问题:
function repeatedString(s, n) { // 统计单个完整s里的a的数量 let singleStrACount = 0; for (let i = 0; i < s.length; i++) { if (s[i] === 'a') singleStrACount++; } // 计算可完整重复的次数 const fullRepeat = Math.floor(n / s.length); // 计算最后剩余的未完整重复的字符长度 const extraChars = n % s.length; // 统计剩余部分的a的数量 let extraACount = 0; for (let i = 0; i < extraChars; i++) { if (s[i] === 'a') extraACount++; } return singleStrACount * fullRepeat + extraACount; }
测试用例数值验证
- 本次测试用例中,s长度为100,单串包含的a的数量为7,总n值为736778906400
- 完整重复次数为736778906400 / 100 = 7367789064,剩余字符长度为0
- 总a数为7 * 7367789064 = 51574523448,和预期输出完全一致
- 原错误代码的计算逻辑为7 * 736778906400 = 5157452344800,刚好和你的实际输出匹配。
内容的提问来源于stack exchange,提问作者Hanzla
相关产品推荐
相关产品推荐

