关于算法题一手顺子的理解

Alice 手中有一把牌,她想要重新排列这些牌,分成若干组,使每一组的牌数都是 groupSize ,并且由 groupSize 张连续的牌组成。

给你一个整数数组 hand 其中 hand[i] 是写在第 i 张牌,和一个整数 groupSize 。如果她可能重新排列这些牌,返回 true ;否则,返回 false 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/hand-of-straights

拿到这道题,我首先的想法就是先思考我们正常对于这种情况的思路(斗地主时候的情景),就是把一样的放在一起,然后理顺就可以很清楚的看出什么时候会有顺子了,那么因为我们需要能看到每张牌的数字,所以我们需要使用哈希表作为存储结构。其实这道题就是我对map的理解的加深。

`	if (hand.length%groupSize!=0){
        return false;
   	 }

    Map<Integer, Integer> map = new HashMap<>();
    Arrays.sort(hand);
    for(int i : hand){
        map.put(i, map.getOrDefault(i, 0) + 1);
    }
    for(int h : hand){
        if(map.get(h) > 0){
            for(int i = 0; i < groupSize; ++i){
                if(map.getOrDefault(i + h, 0) > 0){
                    map.put(h+i, map.get(h+i)-1);
                }else{
                    return false;
                }
            }
        }
    }
    return true;`

第一步整理手牌,将数字判断后加入map里,这里我就学习到了如何使用getOrDefault这一方法,默认返回一个结果的使用,在这里非常好用。如果没有牌就默认置0,如果有就返回加一。
第二部,开始整理顺子,我们整理的时候是都是会每张牌一次一次的整理那么这里也是一样的操作,从第一张牌开始遍历。由于每次整理出来的牌就需要拿走,所以我们需要设置第一个判别条件,如果牌库里面没有牌了,说明只有已经被拿去整理的情况了。接下来就是对于每张牌来了的情况,按照顺序进行,哦对了在我们斗地主的时候都会先进行按照大小进行排序,那么一样的操作,先对数组进行sort,然后按照牌值的大小进行一步步遍历。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值