LeetCode「唯一摩尔斯密码词」JavaScript代码异常问题排查
问题分析:LeetCode「唯一摩尔斯密码词」代码失效原因
问题情况
在解决LeetCode「唯一摩尔斯密码词」时,编写的JavaScript代码在一组测试用例中能正常运行,但在另一组测试用例中完全失效,以下是具体测试用例和代码:
测试用例1(代码正常运行)
var arr1 = [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-....","-","..-","...-",".--","-..-","-.--","--.."]; var arr2 = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']; var words = ["gin","zen","gig","msg"]
测试用例2(代码失效)
var arr1 = ['z','y','x']; var arr2 = ['a','b','c']; var words = ['zzz','xz','zzz','yzx']
问题代码
var mapping={}; for(let i=0;i<arr1.length;i++) { mapping[arr1[i]]=arr2[i]; } const res = word => word.split('').map(c => mapping[c]).join(''); var result = new Set(words.map(res)).size; console.log(result)
失效原因
核心问题是映射关系完全搞反:
- 题目要求建立「字母 → 对应摩尔斯密码」的映射,但你的代码把
arr1(密码/目标值)作为对象的键,arr2(字母/查询键)作为对象的值。 - 后续处理单词时,你拿单词里的字母去
mapping中查找,但mapping的键根本不是字母,而是arr1里的元素,所以大部分情况下会得到undefined,最终拼接出错误的字符串。 - 测试用例1能“正常运行”是巧合——大概率是你实际运行时搞反了
arr1和arr2的输入顺序,让字母数组作为arr1,摩尔斯码数组作为arr2,刚好匹配了你的错误映射逻辑,才得到了正确结果。
修正后的代码
只需反转映射的键值对,用字母作为键,对应的密码作为值:
var mapping={}; for(let i=0;i<arr1.length;i++) { // 字母作为键,对应的密码作为值 mapping[arr2[i]]=arr1[i]; } const res = word => word.split('').map(c => mapping[c]).join(''); var result = new Set(words.map(res)).size; console.log(result)
内容的提问来源于stack exchange,提问作者bharti parmar
相关产品推荐
相关产品推荐

