Java 扑克牌的顺子详解

扑克牌的顺子

题目描述

从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。

2~10 为数字本身,A1J11Q12K13,大小王可以看做任意数字。

为了方便,大小王均以 0 来表示,并且假设这副牌中大小王均有两张。

样例1

输入:[8,9,10,11,12]

输出:true

样例2

输入:[0,8,9,11,12]

输出:true

解法

import java.util.Arrays;

/**
 * @author bingo
 * @since 2018/12/12
 */

class Solution {

    /**
     * 判断是否是连续的数字
     *
     * @param numbers 数组
     * @return 是否是顺子
     */
    public boolean isContinuous(int [] numbers) {
        if (numbers == null || numbers.length == 0) {
            return false;
        }
        int zeroCount = 0;
        Arrays.sort(numbers);
        for (int e : numbers) {
            if (e > 0) {
                break;
            }
            ++zeroCount;
        }

        int p = zeroCount, q = p + 1, n = numbers.length;
        int gap = 0;
        while (q < n) {
            if (numbers[p] == numbers[q]) {
                return false;
            }
            gap += (numbers[q] - numbers[p] - 1);
            p = q;
            ++q;
        }
        return gap <= zeroCount;

    }
}

测试用例

  1. 功能测试(抽出的牌中有一个或者多个大、小王;抽出的牌中没有大、小王;抽出的牌中有对子);
  2. 特殊输入测试(输入空指针)。

教程来源于Github,感谢apachecn大佬的无私奉献,致敬!

技术教程推荐

邱岳的产品手记 -〔邱岳〕

赵成的运维体系管理课 -〔赵成〕

研发效率破局之道 -〔葛俊〕

分布式技术原理与算法解析 -〔聂鹏程〕

NLP实战高手课 -〔王然〕

正则表达式入门课 -〔涂伟忠〕

超级访谈:对话张雪峰 -〔张雪峰〕

遗留系统现代化实战 -〔姚琪琳〕

给程序员的写作课 -〔高磊〕