题解 | #扑克牌顺子#简单区间模拟

扑克牌顺子

https://www.nowcoder.com/practice/762836f4d43d43ca9deb273b3de8e1f4

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param numbers int整型一维数组
     * @return bool布尔型
     */
    public boolean IsContinuous (int[] numbers) {
        if (numbers == null || numbers.length == 0) {
            return false;
        }
        // 扑克牌可能在的区间,实际上就是除0外的最小值到最大值的区间
        // 例如[6,0,2,0,4],只需要验证除0外的最小值2到最大值6的区间是否连续即可
        // 这里使用map来统计零出现的次数,0是任意数,可以出现多次,非0的数字只要出现两次即以上就必然不是顺子
        int max = 0;
        int min = 14;
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < numbers.length; i++) {
            int count = map.getOrDefault(numbers[i], 0) + 1;
            if (numbers[i] != 0) {
                if (count != 1) {
                    return false;
                }
                min = Math.min(min, numbers[i]);
                max = Math.max(max, numbers[i]);
            }
            map.put(numbers[i], count);
        }
        // 获得map中0的数量
        int zoreNum = map.getOrDefault(0, 0);
        // 从最小值区间到最大值区间一个一个试,如果区间内有numbers中没有的数字,看下是否有任意数0
        // 如果有就减1,如果使用完了,还有numbers中不存在的数字,就证明区间不连续
        // 如果能顺利遍历完成则证明区间连续
        for (int i = min; i <= max; i++) {
            if (!map.containsKey(i)) {
                if (zoreNum == 0) {
                    return false;
                } else {
                    zoreNum--;
                }
            }
        }
        return true;
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务