Java 扑克牌顺子算法

xing901022 阅读:55 2022-07-29 11:52:04 评论:0

Java_扑克牌顺子

题目:现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。

有如下规则:

  1. A为1,J为11,Q为12,K为13,A不能视为14

  2. 大、小王为 0,0可以看作任意牌

  3. 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false

  4. 数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0, 13]

思路:

  1. 先对数组执行排序。

  2. 判别重复: 排序数组中的相同元素位置相邻,因此可通过遍历数组,判断 nums[i]=nums[i+1] 是否成立来判重。

  3. 获取最大 / 最小的牌: 排序后,数组末位元素nums[4] 为最大牌;元素 nums[joker] 为最小牌,其中 joker 为大小王的数量。

 

代码:

    public static void main(String[] args) { 
        /** 
         * 现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。 
         * 有如下规则: 
         * 1. A为1,J为11,Q为12,K为13,A不能视为14 
         * 2. 大、小王为 0,0可以看作任意牌 
         * 3. 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。 
         * 4.数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0, 13] 
         */ 
 
        // 自定义五张扑克牌 
        int[] arr = {5,3,7,0,12}; 
        if(arr.length == 0){ 
            // 初始化数据获取随机五张扑克牌 
            arr = init(); 
        } 
 
        System.out.println("是不是顺子 :  " + IsContinuous(arr)); 
 
    }     
 
    public static boolean IsContinuous(int [] numbers) { 
        int joker = 0; 
        Arrays.sort(numbers); // 数组排序 
        // 0 3 5 7 12 
        for(int i = 0; i < 4; i++) { 
            if(numbers[i] == 0) joker++; // 统计大小王数量 
            else if(numbers[i] == numbers[i + 1]) return false; // 若有重复,提前返回 false 
        } 
        return numbers[4] - numbers[joker] < 5; // 最大牌 - 最小牌 < 5 则可构成顺子 
    }

初始化:

    // 初始化数据 
    public static int[] init() { 
        // 定义(2副扑克牌) 
        List<Integer> list = new ArrayList<>(); 
        int num = 2; // 2副扑克牌 
        for (int a = 0; a < num; a++) { 
            list.add(0); list.add(0); 
            for (int i = 0; i < 4; i++) { // 四色 
                for (int j = 1; j < 14; j++) { // A~K 
                    list.add(j); 
                } 
            } 
        } 
        System.out.println("list = " + list.size()); 
 
        // 随机抽取5张 
        List<Integer> arr = new ArrayList<>(); 
        List<Integer> pk = new ArrayList<>(5); 
        boolean flag = true; 
        Random random = new Random(); 
        for (int i = 0, len = 5; i < len; i++) { 
            flag = true; 
            int index = random.nextInt(list.size()); 
            for (int j = 0; j < arr.size(); j++) { 
                if(arr.get(j) == index){ 
                    len ++; 
                    flag = false; 
                    break; 
                } 
            } 
            arr.add(index); 
            if(flag){ 
                pk.add(list.get(index)); 
            }else { 
                continue; 
            } 
        } 
        System.out.println("arr = " + arr); 
        System.out.println("pk = " + pk); 
        return pk.stream().mapToInt(Integer::intValue).toArray(); 
    }

 


本文参考链接:https://www.cnblogs.com/mmdz/p/15608752.html
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

搜索
排行榜
关注我们

一个IT知识分享的公众号