面试题61:扑克牌中的顺子

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

public boolean isContinuous(int [] numbers) {
         if (numbers == null || numbers.length < 5) return false;
        Arrays.sort(numbers);
        int joker = 0;
        //排序后最多有4个0
        for (int i=0;i<4;i++){
            if (numbers[i] == 0) joker++;
        }
        int totalGap = 0;
        //有大小王的话都在前面,所有从后面排除大小王判断
        for (int j=numbers.length-1;j>joker;j--){
            //遇到对子直接返回false
            if (numbers[j] == numbers[j-1]) return false;
            //统计总间隔,比如相邻之间的间隔为0
            totalGap += numbers[j] - numbers[j-1] -1;
        }
        //判断总间隔是否超过大小王
        return totalGap <= joker;
    }

    /**
     * 方法2:除了0之外,其他数字不可重复出现;最大最小值只差不得超过5
     * @param numbers
     * @return
     */
    public static boolean isContinuous2(int [] numbers) {
        if (numbers == null || numbers.length < 5) return false;
        int[] count = new int[14];
        //最小值保持最大,最大值保持最小
        int max = -1;
        int min = 14;
        for (int number : numbers){
            count[number]++;
            //去除大小王
            if (number != 0){
                //不能重复
                if (count[number] > 1) return false;
                if (min > number) min = number;
                if (max < number) max = number;
            }

        }
        return max - min < 5;
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容