Offer 驾到,掘友接招!我正在参与 2022 春招打卡活动,点击查看活动详情。
一、题目描述:
- 电话号码的字母组合-难度中等
给定一个仅包含数字 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'] 的一个数字。
二、题目和思路分析:
这道题好像没什么难度,循环拼接字符即可。为什么是个中等难度???
不管那么多,先写吧。
首先把电话号码数字和字母的对应关系写出来。
然后判断输入字符串的长度,长度为0返回空数组,长度为1返回当前数字对应的数组。
如果输入字符串长度为2及2以上,则可以归纳为两个数组合并可能性的操作,单独写一个方法。
遍历输入字符串,调用拼接数组方法即可。
三、代码:
代码实现如下:
/**
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function(digits) {
let obj = {
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'],
}
let length = digits.length
if(!length) return [] // 如果没有长度即空字符串,返回[]
if(length == 1) return obj[digits[0]] // 如果字符串长度为1,直接返回当前数字对应的数组
let arr = obj[digits[0]] // 初始arr为第一项
let i = 1
while( i < length){ // 不断调用当前项和下一项拼接方法
arr = splicing(arr, obj[digits[i++]])
}
return arr
// 返回两数组的字母拼接可能性
function splicing(arr1, arr2){
let arr = []
for(let i = 0; i<arr1.length; i++){
for(let j = 0; j<arr2.length; j++){
arr.push(arr1[i] + arr2[j])
}
}
return arr
}
};
四、总结:
这道题写的中等,其实没什么难度,把大问题拆成小问题即可。
提交两次错误,第一次因为考虑不周到,忽略了只有一个字符的情况。第二次因为逻辑错了,返回值应该直接是两数组的拼接值,而不必再次用concat去拼接数组。着实是写着写着懵了。
加油吧!