【Offer】[61] 【扑克牌中的顺子】

题目描述

  从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10 为数字本身,A为1, J为11, Q为12,K为13,而大、小王可以看成任意数字。

牛客网刷题地址

思路分析

  将问题转化为 判断5个数字是不是连续的,要注意其中大小王用0代替,最直观的方法是把数组排序。由于0(大小王)可以当成任意数字,我们可以用0去补满数组中的空缺。如果排序之后的数组不是连续的,即相邻的两个数字相隔若干个数字,那么只要我们有足够的0可以补满这两个数字的空缺,这个数组实际上还是连续的。举个例子,数组排序之后为{0,1,3,4,5},在1和3之间空缺了一个2,刚好我们有一个0,也就是我们可以把它当成2去填补这个空缺。

测试用例

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

Java代码

public class Offer061 {
    public static void main(String[] args) {
        test1();
        test2();
        test3();

    }

    public static boolean isContinuous(int[] numbers) {
        return Solution1(numbers);
    }

    private static boolean Solution1(int[] numbers) {
        if (numbers == null || numbers.length <= 0)
            return false;
        Arrays.sort(numbers);
        int numberOf0 = 0;
        int numberOfGap = 0;
        for (int i = 0; i < numbers.length; i++) {
            if (numbers[i] == 0)
                numberOf0++;
        }
        int small = numberOf0;
        int big = numberOf0 + 1;
        while (big < numbers.length) {
            if (numbers[small] == numbers[big])
                return false;
            numberOfGap += numbers[big++] - numbers[small++] - 1;
        }
        if (numberOf0 >= numberOfGap) 
            return true;
        return false;
    }

    private static void test1() {

    }

    private static void test2() {

    }

    private static void test3() {

    }

}

代码链接

剑指Offer代码-Java

原文地址:https://www.cnblogs.com/haoworld/p/offer61-pu-ke-pai-zhong-de-shun-zi.html