题目:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

分析:

  1. 将数字转成对应的字母
  2. 把需要合并的数组,每次合并前2个,然后通过splice修正数组,
    1. 如果剩余长度大于1个,则继续合并。
    2. 长度为1,则执行返回

      主要使用2个值合并,然后把合并的值归入数组中,继续2个的合并。

代码实现

  1. /**
  2. * @param {string} digits
  3. * @return {string[]}
  4. */
  5. var letterCombinations = function(digits) {
  6. let num2Str = [0,0,"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]
  7. let digitsArr = digits.split("").map(item=>{
  8. return parseInt(item)
  9. })
  10. let code = [] //将数字数组转换为字符串格式的数组 [2,3,4] => ["abc", "def", "ghi"]
  11. digitsArr.forEach(item=>{
  12. if(!!num2Str[item]){
  13. code.push(num2Str[item])
  14. }
  15. })
  16. let combine =(arr)=>{
  17. let tmp = []
  18. if(arr.length>1){
  19. for(let i=0;i<arr[0].length;i++){
  20. for(let j=0;j<arr[1].length;j++){
  21. tmp.push(`${arr[0][i]}${arr[1][j]}`)
  22. }
  23. }
  24. }else if(arr.length==1){
  25. for(let i=0;i<arr[0].length;i++){
  26. tmp.push(`${arr[0][i]}`)
  27. }
  28. }
  29. // 非常重要的替换删除操作
  30. arr.splice(0,2,tmp)
  31. if(arr.length>1){
  32. combine(arr)
  33. }else{
  34. return tmp
  35. }
  36. return arr[0]
  37. }
  38. return combine(code)
  39. };
  1. var letterCombinations = function (digits) {
  2. // 建立数字与字母的对应关系
  3. let letter = [0, 0, "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"];
  4. let digitNum = digits.split("").map((item) => parseInt(item, 10)); //2
  5. let showLetter = [];
  6. for (let i = 0; i < digitNum.length; i++) {
  7. // console.log(letter[digitNum[i]]); // digitNum [ 2,3 ]
  8. showLetter.push(letter[digitNum[i]]);
  9. }
  10. // console.log(showLetter);
  11. return showEveryLetter(showLetter);
  12. };
  13. function showEveryLetter(letter) {
  14. if (letter.length === 0) return [];
  15. if (letter.length === 1) {
  16. return letter[0].split("");
  17. }
  18. let combineTwo = [];
  19. if (letter.length > 1) {
  20. for (let i = 0; i < letter[0].length; i++) {
  21. for (let j = 0; j < letter[1].length; j++) {
  22. combineTwo.push(letter[0][i] + letter[1][j]);
  23. }
  24. }
  25. }
  26. letter.splice(0, 2, combineTwo);
  27. // console.log(letter, combineTwo, "outter");
  28. if (letter.length > 1) {
  29. // console.log(letter, "before");
  30. showEveryLetter(letter);
  31. // 大于2个参数时的返回值
  32. // console.log(letter, "letter");
  33. return letter[0];
  34. } else {
  35. return combineTwo;
  36. }
  37. }