【力扣刷题记 17】——《电话号码的字母组合》

145 阅读1分钟

Offer 驾到,掘友接招!我正在参与 2022 春招打卡活动,点击查看活动详情

一、题目描述:

  1. 电话号码的字母组合-难度中等

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

image.png

 

示例 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去拼接数组。着实是写着写着懵了。

加油吧!

image.png