您当前的位置: 首页 >  leetcode

暂无认证

  • 2浏览

    0关注

    92582博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

leetcode:17 电话号码的字母组合

发布时间:2020-07-31 00:53:06 ,浏览量:2

/**
 * @param {string} digits
 * @return {string[]}
 */ var letterCombinations = function(str) { // 对输入做处理,如果小于1返回空(LeetCode测试用例) if (str.length < 1) return [] // 建立电话号码键盘映射 let map = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz'] // 如果只给了一个按键,直接把按键内容取出来并按单个字符分组就可以了(LeetCode测试用例) if (str.length < 2) return map[str].split('') // 把输入字符串按单字符分隔变成数组,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, il = arr[0].length; i < il; i++) { for (let j = 0, jl = arr[1].length; j < jl; j++) { tmp.push(`${arr[0][i]}${arr[1][j]}`) } } arr.splice(0, 2, tmp) if (arr.length > 1) { comb(arr) } else { return tmp } return arr[0] } return comb(code) }; 

题目理解: 2~9相对应的映射到的字母,获得它所能组成的(((所有的)))字母组合.注意,1什么都没有,1不用算. 比如输入的是23,就是2与3进行组合,并且组合成的数组每一个数组的下标是两个字符的。。。。。 例如输入234,那就是先23进行组合,组合成的数组又与4进行组合,然后输出的每一个数组1的下标是3个。以此类推。。。。。

思路;先联系好所在的数字锁映射到的字母先. 然后是数字2与数字3运算然后组合,然后组成成的(2 3)新数组与4算,然后又组成新(234)一个数组与5算(这样一来都是两两算。)…就行了.

解题步骤: 先映射: let map = [’’, 1, ‘abc’, ‘def’, ‘ghi’, ‘jkl’, ‘mno’, ‘pqrs’, ‘tuv’, ‘wxyz’] 把输入的数字映射(对应)到相对应的字母.

if (str.length < 1) return [] // 建立电话号码键盘映射 let map = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz'] // 如果只给了一个按键,直接把按键内容取出来并按单个字符分组就可以了(LeetCode测试用例) if (str.length < 2) return map[str].split('') // 把输入字符串按单字符分隔变成数组,234=>[2,3,4] let num = str.split('') // 保存键盘映射后的字母内容,如 23=>['abc','def'] let code = [] num.forEach(item => { if (map[item]) { code.push(map[item]) } }) 
num.forEach(item => { if (map[item]) { code.push(map[item]) } }) 

这一句是把num也就是输入的数字遍历一下,然后判断map中的下标有没有与输入的一样的数字啊。 有就push进code里,code有什么作用?保存键盘映射后的字母内容

然后是下面是进行组合了.(代码)

// 临时变量用来保存前两个组合的结果 let tmp = [] // 最外层的循环是遍历第一个元素,里层的循环是遍历第二个元素 for (let i = 0, il = arr[0].length; i < il; i++) { for (let j = 0, jl = arr[1].length; j < jl; j++) { tmp.push(`${arr[0][i]}${arr[1][j]}`) } } arr.splice(0, 2, tmp) if (arr.length > 1) { comb(arr) } else { return tmp } return arr[0] } return comb(code) 

核心代码:(两个两个组合的代码)

for (let i = 0, il = arr[0].length; i < il; i++) { for (let j = 0, jl = arr[1].length; j < jl; j++) { tmp.push(`${arr[0][i]}${arr[1][j]}`) } } 
arr.splice(0, 2, tmp) 

这一句是用tmp这一个替换相组合的两个。 然后tmp这个临时的变量继续与下一个进行组合.

let tmp = [] 

为什么tmp是临时的变量,因为他的数据会变化的。

然后通过递归继续与第三个。。。输入的进行组合.

一些条件:

if (arr.length > 1) { comb(arr) } else { return tmp } 

为什么,因为最后只剩下一个下标了哈(组合输入的全部完的基础上)

完成…

关注
打赏
1653961664
查看更多评论
立即登录/注册

微信扫码登录

0.1102s