「这是我参与2022首次更文挑战的第37天,活动详情查看:2022首次更文挑战」
17. 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入: digits = "23"
输出: ["ad","ae","af","bd","be","bf","cd","ce","cf"]
复制代码
示例 2:
输入: digits = ""
输出: []
复制代码
示例 3:
输入: digits = "2"
输出: ["a","b","c"]
复制代码
提示:
0 <= digits.length <= 4
digits[i]
是范围['2', '9']
的一个数字。
reduce循环
思路 有题目可知,我们需要通过手机上的数字按键拼出所有的字母子组合
很明显我们都知道需要通过循环去遍历出所有的结果
但是问题是按键的数量是不确定的,不知道会有几个数字
所以这里我们通过reduce的双循环每次拿出两个数组对应的英文字母进行组合,然后再用组合的结果和下一个数字对应的字母去循环,这样把多层循环简化成2层循环了
具体实现:
- 处理边界条件,如果digits为空的时候,直接返回空数组
- 声明map对象,将每一个数字对应的字母列出来
- 将digits用split打断成数组然后用reduce循环
- 将total和item的所有可能双循环遍历出来保存在res中返回,最后会处理处所有的可能
最后直接返回循环结果即可
var letterCombinations = function (digits) {
if (!digits) return []
var map = {
2: ['a', 'b', 'c'],
3: ['d', 'e', 'f'],
4: ['g', 'h', 'i'],
5: ['j', 'k', 'l'],
6: ['m', 'n', 'o'],
7: ['p', 'q', 'r', 's'],
8: ['t', 'u', 'v'],
9: ['w', 'x', 'y', 'z']
}
var arr = digits.split('').map(item => map[item])
return arr.reduce((total, item) => {
var res = []
for (var i = 0; i < total.length; i++) {
for (var j = 0; j < item.length; j++) {
res.push(total[i] + item[j])
}
}
return res
})
};
复制代码
谢谢大家,一起加油