卡牌分组

卡牌分组


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

此时,你需要选定一个数字 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,1,1,1,2,2,2,2,3,3,3,3,4,4] 结果false

 function CardGrouping(arr) {
            // 对这副牌进行排序,升序、降序都可以
            arr.sort((a, b) => a - b)
            let min = Number.MAX_SAFE_INTEGER
            let dst = []
            let result = true
            for (let i = 0, len = arr.length, tmp = []; i < len; i++) {
                tmp.push(arr[i])
                for (let j = i + 1; j < len - 1; j++) {
                    if (arr[i] === arr[j]) {
                        tmp.push(arr[j])
                    } else {
                        if (min > tmp.length) {
                            min = tmp.length
                        }
                        dst.push([].concat(tmp))
                        tmp.length = 0
                        i = j
                        break
                    }
                }
            }
            dst.every(item => {
                if (item.length % min !== 0) {
                    result = false
                    return false
                }
            })
            return result
        }

重新写了个:

    function CardGrouping(v) {
            let tmp = []
            v.sort()
            v.forEach(value => {
                if (!tmp[value]) {
                    tmp[value] = 1
                } else {
                    tmp[value]++
                }
            });
            tmp.sort()
            return tmp.every(v => {
                if (tmp[0] < 2) return false
                return v % tmp[0] == 0
            })

        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值