268、卡牌分组

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

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

每组都有 X 张牌。

组内所有的牌上都写着相同的整数。

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

  

示例 1

输入:deck = [1,2,3,4,4,3,2,1]

输出:true

解释:可行的分组是 [1,1],[2,2],[3,3],[4,4]

示例 2

输入:deck = [1,1,1,2,2,2,3,3]

输出:false

解释:没有满足要求的分组。

提示:

1 <= deck.length <= 104

0 <= deck[i] < 104

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

package cn.fansunion.leecode.intelligence;

import java.util.Map;

import java.util.Map.Entry;

import cn.fansunion.leecode.kit.Kit;

/**

 * 914. 卡牌分组 <br/>

 * 给定一副牌,每张牌上都写着一个整数。 <br/>

 *

 * 此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组: <br/>

 *

 * 每组都有 X 张牌。 组内所有的牌上都写着相同的整数。 <br/>

 * 仅当你可选的 X >= 2 时返回 true。 <br/>

 *

 * 来源:力扣(LeetCode) 链接:力扣 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 *

 * @author wen.lei@brgroup.com

 *

 *         2022-3-9

 */

public class XOfAKindInADeckOfCards {

    /*    示例 1:

     

    输入:deck = [1,2,3,4,4,3,2,1]

    输出:true

    解释:可行的分组是 [1,1],[2,2],[3,3],[4,4]

    示例 2:

     

    输入:deck = [1,1,1,2,2,2,3,3]

    输出:false

    解释:没有满足要求的分组。

     

    提示:

     

    1 <= deck.length <= 104

    0 <= deck[i] < 104*/

    /**

     * 题目的意思:统计各个数出现的次数,然后求次数之间是否存在公约数

     *

     *

     */

    public boolean hasGroupsSizeX(int[] deck) {

        Map<Integer, Integer> countMap = Kit.countMap(deck);

        int prevSize = 0;

        for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) {

            final Integer currentSize = entry.getValue();

            if (currentSize.equals(1)) {

                return false;

            }

            if (prevSize == 0) {

                prevSize = currentSize;

            else {

                int gcd = Kit.gcd(prevSize, currentSize);

                if (gcd < 2) {

                    return false;

                else {

                    prevSize = currentSize;

                }

            }

        }

        return true;

    }

    /**

     * 解题思路:计算每个数字出现的次数;如果数字出现的次数=1,false;每个数字次数,都相等,返回true

     * <br/> 与题目意思不符:[1,1,2,2,2,2],可以分成[1,1],[2,2],[2,2]

     *

     * @param deck

     * @return

     */

    public boolean hasGroupsSizeXError(int[] deck) {

        Map<Integer, Integer> countMap = Kit.countMap(deck);

        int prevSize = 0;

        for (Entry<Integer, Integer> entry : countMap.entrySet()) {

            final Integer currentSize = entry.getValue();

            if (currentSize.equals(1)) {

                return false;

            }

            if (prevSize == 0) {

                prevSize = currentSize;

            else {

                if (prevSize != currentSize) {

                    return false;

                else {

                    prevSize = currentSize;

                }

            }

        }

        return true;

    }

}

package test.leecode.intelligence;

import org.junit.Assert;

import org.junit.Test;

import cn.fansunion.leecode.intelligence.XOfAKindInADeckOfCards;

/**

 * @author wen.lei@brgroup.com

 *

 * 2022-2-25

 */

public class XOfAKindInADeckOfCardsTest {

    @Test

    public void test() {

        XOfAKindInADeckOfCards test = new XOfAKindInADeckOfCards();

        Assert.assertTrue(test.hasGroupsSizeX(new int[] {1,1,2,2,2,2,3,3,3,3}));

        Assert.assertTrue(test.hasGroupsSizeX(new int[] {1,1,2,2,2,2}));

        Assert.assertFalse(test.hasGroupsSizeX(new int[] {1,2,3,4}));

        Assert.assertTrue(test.hasGroupsSizeX(new int[] {1,2,3,4,4,3,2,1,5,6,6,5}));

        Assert.assertTrue(test.hasGroupsSizeX(new int[] {1,2,3,4,4,3,2,1}));

        Assert.assertFalse(test.hasGroupsSizeX(new int[] {1,1,1,2,2,2,3,3}));

        Assert.assertFalse(test.hasGroupsSizeX(new int[] {1,2,3,4,4}));

        Assert.assertFalse(test.hasGroupsSizeX(new int[] {1,2,2}));

    }

     

    @Test

    public void testError() {

        XOfAKindInADeckOfCards test = new XOfAKindInADeckOfCards();

        Assert.assertFalse(test.hasGroupsSizeXError(new int[] {1,2,3,4}));

        Assert.assertTrue(test.hasGroupsSizeXError(new int[] {1,2,3,4,4,3,2,1,5,6,6,5}));

        Assert.assertTrue(test.hasGroupsSizeXError(new int[] {1,2,3,4,4,3,2,1}));

        Assert.assertFalse(test.hasGroupsSizeXError(new int[] {1,1,1,2,2,2,3,3}));

        Assert.assertFalse(test.hasGroupsSizeXError(new int[] {1,2,3,4,4}));

        Assert.assertFalse(test.hasGroupsSizeXError(new int[] {1,2,2}));

    }

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值