给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
/**
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function(digits) {
const maps = {
2: "abc",
3: "def",
4: "ghi",
5: "jkl",
6: "mno",
7: "pqrs",
8: "tuv",
9: "wxyz"
}
const res = [];
for (let num of digits) {
let w = maps[num];
if (res.length > 0) {
let tmp = []
for(let i = 0; i < res.length; i++) { //标记1
for(let j = 1; j < w.length; j++) {
tmp.push(res[i] + w[j])
}
res[i] += w[0] //标记2
}
res.push(...tmp)
} else {
res.push(...w);
}
}
return res;
};
备注:
标记1处,
首先想到用for in 实现的,测试了,最后的结果也是正确的,但是看到资料说,for in可以用于数组,遍历数组的索引index,但是要少用,原因是:
- index是字符串型的数字,不能进行几何运算
- index的顺序有可能不是数组的实际顺序
- for in会遍历数组的所有的可以枚举的属性,包括原型上的
因此这里就没有用for in,但是for in更适合用来遍历对象。
为了防止其检索方法函数,可以在里面加一个if,如下:
for(let index in obj) {
if(obj.hasOwnProperty(index)){
//your code
}
}
然后,这里想到用for of直接取数组中的值item,程序没有报错,但是结果有问题,就是在标记2出,写成item += w[0]时,用debugger调试,这一步运行了,但是对应的item的值没有发生改变,我不明白是为什么,感谢诸位在留言区给出解答,在下定当感激不尽