ROT13解码函数问题求助:解码字符与原字符重复如何解决?
问题分析与解决
错误核心
你的代码现在的问题很明确:处理每个字符时,不管是不是字母,最后都会额外把原字符再push到结果数组里。比如处理字母"S"时,先push了解码后的"F",紧接着又push了原字符"S",导致结果里解码字符和原字符重复出现;非字母字符虽然不会被解码,但只被push一次,所以空格、标点是正常的,但字母部分就会出现重复叠加。
修正方案
- 把
result.push(splitted[i])移到else分支里,仅当字符是非字母时,才把原字符加入结果;字母只保留解码后的字符,不再重复添加原字符。 - 将两个独立的
if改为if-else,因为大写字母只会落在65-77或78-90其中一个区间,避免重复判断。 - 正则表达式简化为
/\W/即可,你是判断单个字符,不需要+(+用于匹配连续多个非单词字符)。
修正后的代码
function rot13(str) { const splitted = str.split('') const regex = /\W/ let result = [] for(let i=0;i<splitted.length;i++){ const char = splitted[i] if(!regex.test(char)){ const charCode = char.charCodeAt() if(charCode >=65 && charCode <=77){ result.push(String.fromCharCode(charCode +13)) } else { result.push(String.fromCharCode(charCode -13)) } } else { result.push(char) } } return result.join('') } // 测试验证 console.log(rot13("SERR PBQR PNZC")) // 输出 FREE CODE CAMP console.log(rot13("SERR CVMMN!")) // 输出 FREE PIZZA!
内容的提问来源于stack exchange,提问作者akari
相关产品推荐
相关产品推荐

