题目:电话号码字母的组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
使用JavaScript语言:
/**
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function(digits) {
var arr = ['','','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz'];
if(digits == ''){
return [];
}else{
var newarr = [];
digits.split('').forEach(function(item){
var arr2 = arr[item].split('');
newarr.push(arr2)
})
// console.log(newarr)
var all = [];
all = newarr.reduce(function(a,b){
var temp = []
a.forEach(function(a){
b.forEach(function(b){
temp.push(a + b)
})
})
// console.log(temp)
return temp
})
return all
}
};
分析
首先先根据digits是否有数字进行判断分析,如果是空字符串,则返回空数组。然后建立一个数组arr去对应键盘上0-9的英文字母数组。将digits字符串中的字符使用split切割,然后使用forEach去对数字循环遍历,产生一个二维的字母数组。
以‘234’为例子,产生的newarr数组如下:
然后使用reduce去进行相加,reduce这个过程分为两步:
先是['a','b','c']和["d", "e", "f"]相加得出ad,ae,af,bd,be,bf,cd,ce,cf数组,然后是ad,ae,af,bd,be,bf,cd,ce,cf数组和["g", "h", "i"]相加,得到最后的数组:["adg", "adh", "adi", "aeg", "aeh", "aei", "afg", "afh", "afi", "bdg", "bdh", "bdi", "beg", "beh", "bei", "bfg", "bfh", "bfi", "cdg", "cdh", "cdi", "ceg", "ceh", "cei", "cfg", "cfh", "cfi"]