卡牌分组(ing
一、题目描述
给定一副牌,每张牌上都写着一个整数。
此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组:
- 每组都有 X张牌。
- 组内所有的牌上都写着相同的整数。
- 仅当你可选的 X >= 2时返回 true。
示例1
输入:[1,2,3,4,4,3,2,1]
输出:true
解释:可行的分组是 [1,1],[2,2],[3,3],[4,4]
示例2
输入:[1,1,1,2,2,2,3,3]
输出:false
解释:没有满足要求的分组。
示例3
输入:[1]
输出:false
解释:没有满足要求的分组。
示例4
输入:[1,1]
输出:true
解释:可行的分组是 [1,1]
示例5
输入:[1,1,2,2,2,2]
输出:true
解释:可行的分组是 [1,1],[2,2],[2,2]
提示
- 1 <= deck.length<= 10000
- 0 <= deck[i]< 10000
二、题解
1、★☆☆
使用递归的方式,两两分配后再两两分配:
/**
 * @param {string} digits
 * @return {string[]}
 */
var letterCombinations = function (digits) {
  const strList = [
    [],
    [],
    ["a", "b", "c"],
    ["d", "e", "f"],
    ["g", "h", "i"],
    ["j", "k", "l"],
    ["m", "n", "o"],
    ["p", "q", "r", "s"],
    ["t", "u", "v"],
    ["w", "x", "y", "z"],
  ];
  if (digits.length >= 2) {
    let resultArr = [];
    // 递归函数
    const handle = (arr) => {
      if (arr.length >= 2) {
        const addArr = [];
        arr[0].map((item1) => {
          arr[1].map((item2) => {
            addArr.push(item1 + item2);
          });
        });
        
        arr.shift();
        arr.shift();
        const newArr = [addArr, ...arr];
        // 这里替换前两个数组的操作可以直接用 splice() 实现
        handle(newArr);
      } else {
        resultArr = arr[0];
      }
    };
    const strArr = [];
    const digitsArr = digits.split("");
    digitsArr.map((item) => {
      const curNum = Number(item);
      strArr.push(strList[curNum]);
    });
    handle(strArr);
    return resultArr;
  } else if ((digits.length = 1)) {
    return strList[Number(digits)];
  } else {
    return [];
  }
};