凯撒密码变体解密问题:如何移除字符串中的随机插入字符
解决凯撒密码变体解密时移除随机插入字符的问题
你的代码存在几个关键问题,导致无法正确移除随机插入的字符:
- 字符串替换逻辑错误:
decryptedMessage.replace(decryptedMessage[i],"")会替换整个字符串中所有匹配该字符的内容,而非仅移除当前索引处的随机字符,这会误删原消息中的有效字符。 - 循环拼接逻辑错误:每次循环都向结果字符串追加内容,触发
i%2===0时,你追加的是替换后的整个字符串,导致最终结果重复拼接多次原字符串,这就是输出异常冗长的原因。 - 插入位置判断错误:根据加密规则(每2个字符后插入一个随机字母),随机字符的位置是加密字符串中每3个字符的第3个(索引为2、5、8...),而非偶数索引。
正确的移除随机字符函数
// 注意:原变量定义需要添加引号 let decryptedMessage = "seoekx tbhea mtidrniughkt"; function finalMessage(encryptedStr) { let result = ""; for (let i = 0; i < encryptedStr.length; i++) { // 跳过每3个字符中的第3个(即插入的随机字符) if (i % 3 !== 2) { result += encryptedStr[i]; } } return result; } const finalMessageResult = finalMessage(decryptedMessage); console.log(`The final decrypted message is ${finalMessageResult}`);
另一种更直观的实现方式(按3字符分组取前2个)
function finalMessage(encryptedStr) { let result = ""; // 每3个字符为一组,每次取前2个有效字符 for (let i = 0; i < encryptedStr.length; i += 3) { result += encryptedStr[i]; // 处理字符串长度不是3的倍数的情况(最后一组可能不足3个字符) if (i + 1 < encryptedStr.length) { result += encryptedStr[i + 1]; } } return result; }
加密时每2个原字符后插入一个随机字母,因此加密后的字符串结构为:[原字符1][原字符2][随机字符][原字符3][原字符4][随机字符]...。上述代码通过跳过每3个字符中的第3个(或直接按3字符分组取前2个),精准移除所有插入的随机字符,保留原消息的有效内容。
内容的提问来源于stack exchange,提问作者Brice N
相关产品推荐
相关产品推荐

