每日一道算法题

263 阅读1分钟
  1. 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

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

示例:

输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]. 说明: 尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

// str 类型为字符串,比如输入'23''4567'
function numberCompose (str) {
     // 建立电话号码键盘映射
    let map = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz'];
    //把输入字符串按单个字符分割变成数组  234=>[2,3,4]
    let num = str.split('')
    // 保存键盘映射后的字母内容,如 23=> ['abc', 'def']
    let code = [];
    num.forEach(item => {
        // 对应关系检查
        if (map[item]) {
            code.push(map[item])
        }
    })
    let comb = (arr) => {
        // 临时变量,用来保存前两个组合的结果
        let tmp = []
        // 最外层的循环是遍历第一个元素,里层的循环是遍历第二个元素
        for (let i = 0; i < arr[0].length;i++) {
            for (let j = 0; j < arr[1].length;j++) {
                temp.push(`${arr[0][i]}${arr[1][j]}`)
            }
        }
        // 前两个元素不要,然后替换掉
        arr.splice(0, 2, tmp)
        if (arr.length > 1) {
            // 递归
            comb(arr)
        } else {
            return temp
        }
        // 组合后就剩下数组的一项了,所以直接返回数组的第一项即可
        return arr[0]
    }
    return comb(code) // 返回组合运算的输出
}