卡牌分组-

这篇博客介绍了一个编程问题,即检查一副包含整数的牌是否能被分成若干组,每组牌数相同且组内数字一致。解决思路是首先对牌进行排序,然后找出最小组的长度,并遍历牌组,确保所有组的长度都是最小组长度的整数倍。最后,通过检查这个条件来确定是否可以按要求分组。代码中使用了JavaScript实现该算法,主要涉及数组操作和循环遍历。
摘要由CSDN通过智能技术生成

题目:

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

此时,你需要选定一个数字 x,使我们可以将整幅牌按下述规则分成1组或更多组:

  • 每组都有x张牌
  • 组内所有的牌上都写着相同的整数

仅当你可选的 x>=2时,返回true

参考示例:

思路:

最小的分组的长度,是这个分组的长度的最小值和其他的数字的长度是整数倍的关系即满足

代码:

 <script>
        const hasGroupsSizeX = arr => {
            arr.sort((a, b) => a - b); //排序
            //记录分出来的组的最小的长度
            let min = Number.MAX_SAFE_INTEGER;
            let dst = []; //记录每个分组
            let result = true;

            //遍历
            //生成一个临时变量-->tmp[],用来保存当前分组的所有元素
            for (let i = 0, len = arr.length, tmp = []; i < len; i++) {
                tmp.push(arr[i]); //存储

                //判断当前元素的下一个元素是不是跟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 tmp,那么最终的结果会出错
                        dst.push([].concat(tmp));
                        tmp.length = 0; //清空临时数组
                        i = j; //为了让i从当前不符合的这一项开始向后继续
                        break;
                    }
                }

            }

            //检验:这个分组的长度的最小值和其他的数字的长度是整数倍的关系
            //every() 方法用于检测数组所有元素是否都符合指定条件
            //这里不用forEach的原因是forEach不支持跳出,也就是不支持for循环的break的功能
            dst.every(item => {
                if (item.length % min !== 0) {
                    result = false;
                    return false;
                }
            })
            return result;
        }
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白小白从不日白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值