914. 卡牌分组

给定一副牌,每张牌上都写着一个整数。

此时,你需要选定一个数字 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]

题解

/**
 * @param {number[]} deck
 * @return {boolean}
 */
var hasGroupsSizeX = function(deck) {
    let a = []
    let arr = []
    let c = 0

    function getBigFactor(a, b) {
        if (b == 0) {
            return a;
        }
        return getBigFactor(b, a % b)
    }

    deck.sort((a, b) => a - b)
    for (let i = 0; i < deck.length - 1; i++) {
        if (deck[i] == deck[i + 1]) {
            a.push(deck[i])
        }
        if (deck[i] != deck[i + 1] || i == deck.length - 2) {
            if (a.length > 0) {
                arr.push(a.length + 1)
            }
            a = []
        }
    }
    for (let i = 0; i < arr.length; i++) {
        c += arr[i]
        if (getBigFactor(arr[0], arr[i]) == 1) {
            return false
        }
    }
    if (arr.length == 0 || c != deck.length) {
        return false
    }
    return true
};