`

java-67-扑克牌的顺子.从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2-10为数字本身,A为1,J为11,Q为12,K为13,而大

 
阅读更多
package com.ljn.base;

import java.util.Arrays;
import java.util.Random;

public class ContinuousPoker {

    /**
     * Q67 扑克牌的顺子 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。
     * 2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。
     */
    private static final int[] poker = { 
            0, 0, 
            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
            };
    
    private static final int MAX = 5;
    private static final int MAX_VAL = 13;

    public static void main(String[] args) {
        // test 1.Specific data for test.
        int[][] testData = { 
                { 7, 8, 0, 10, 11 }, 
                { 7, 8, 0, 0, 11 },
                { 8, 9, 9, 10, 11 }, 
                { 7, 8, 9, 10, 11 }, 
                { 0, 8, 0, 10, 11 }, 
                };
        for (int[] pokerSelected : testData) {
            test(pokerSelected);
        }
        // test 2.Imitate the real situation:Select 5 poker randomly.
        int[] pokerSelected = randomSelect(poker, MAX);
        test(pokerSelected);

    }

    public static void test(int[] pokerSelected) {
        System.out.println(Arrays.toString(pokerSelected));
        boolean continuous = isContinuous(pokerSelected);
        System.out.println("continuous is " + continuous);
    }

    /*
     * 1)确认5张牌中除了0,其余数字没有重复的(可以用表统计的方法); 
     * 2)
     * 满足这样的逻辑:(max,min分别代表5张牌中的除0以外的最大值最小值) 如果没有0,则max-min=4,则为顺子,否则不是
     * 如果有一个0,则max-min=4或者3,则为顺子,否则不是 如果有两个0,则max-min=4或者3或者2,则为顺子,否则不是
     * 
     * 最大值和最小值在第1步中就可以获得
     */
    public static boolean isContinuous(int[] x) {
        int[] existTimes = new int[MAX_VAL + 1];
        boolean result = false;
        int len = x.length;
        int max = x[0], min = x[0];
        int zeroCount = 0;
        for (int i = 0; i < len; i++) {
            existTimes[x[i]]++;// record the number of occurrences
            if (x[i] == 0) {
                zeroCount++;
            } else {
                if (x[i] > max || max == 0)
                    max = x[i];
                if (x[i] < min || min == 0)
                    min = x[i];
            }
        }
        for (int i = 1; i < MAX_VAL; i++) {// i starts from 1,exclude '0'
            if (existTimes[i] > 1) {// duplicate non-zero element
                return false;
            }
        }
        if (zeroCount == 0) {
            if (max - min == MAX - 1)
                result = true;
        } else if (zeroCount == 1) {
            if (max - min == MAX - 1 || max - min == MAX - 2)
                result = true;
        } else if (zeroCount == 2) {
            if (max - min == MAX - 1 || max - min == MAX - 2 || max - min == MAX - 3)
                result = true;
        }

        return result;
    }

    /*
     * @param count how many elements you want to pick
     * 
     * @param data the data array
     */
    public static int[] randomSelect(int[] data, int count) {
        int[] result = new int[count];
        int len = data.length;
        for (int i = 0; i < count; i++) {
            Random random = new Random();
            int pos = random.nextInt(len);
            result[i] = data[pos];// pick out the element
            data[pos] = data[len - 1];// and replace it with the last element
            len--;
        }
        return result;
    }
}
0
0
分享到:
评论
3 楼 bylijinnan 2013-04-09  
aprilfore 写道
初始化min时若值为0,则后面if(x[i]<min)min=x[i];操作无效



确实是个bug
多谢指正 改过来了
2 楼 aprilfore 2013-04-08  
初始化min时若值为0,则后面if(x[i]<min)min=x[i];操作无效
1 楼 aprilfore 2013-04-08  
那个测试样例是{0,8,0,10,11},貌似返回false啊

相关推荐

    php代码-从扑克牌中随机抽取5张牌,判断是不是一个顺子

    在PHP编程中,实现从扑克牌中随机抽取五张牌并判断是否为顺子是一个有趣的挑战,涉及到数组操作、随机数生成以及逻辑判断等基础知识。下面我们将深入探讨这个任务涉及的关键知识点。 首先,我们需要了解扑克牌的...

    扑克牌的顺子.md

    扑克牌的顺子.md

    java 扑克牌游戏

    在Java编程领域,开发一款扑克牌游戏是一种常见的实践项目,旨在...总的来说,这个“java 扑克牌游戏”项目涵盖了Java编程的多个重要方面,对于学习和提升Java编程能力,尤其是游戏开发经验,是一个很好的实践平台。

    易语言模块扑克牌模块1.0.rar

    《易语言模块扑克牌模块1.0》是一个专为易语言设计的扩展模块,它旨在为程序员提供方便、高效地处理扑克牌游戏逻辑的工具。这个模块包含了丰富的扑克牌操作函数和类,使得开发者能够快速地构建各种类型的扑克牌游戏...

    用Java编写的扑克牌游戏

    在本项目中,我们探讨的是一个使用Java编程语言开发的扑克牌游戏。这种类型的游戏是计算机科学中的一个经典示例,因为它涉及到数据结构、算法以及面向对象编程的概念。以下是关于这个项目的详细知识点: 1. **Java...

    java基础面试题扑克牌顺子

    java基础面试题扑克牌顺子本资源系百度网盘分享链接

    54张标准扑克牌

    在编程实现扑克牌时,可以创建一个类来表示单张牌,包含属性如花色、数字和类型(是否为Joker)。例如,可以定义一个`Card`类,其构造函数接受两个参数,分别表示花色和数值。为了方便存储和操作,通常会用枚举类型...

    C++判断牌型

    本话题聚焦于"C++判断牌型",即如何用C++编程语言处理扑克牌的牌型判断问题。这个问题涉及到数据结构、算法以及逻辑思维,是学习C++高级编程的一个好实例。 首先,我们需要定义扑克牌的数据结构。每张扑克牌通常...

    Java 实现斗地主扑克牌排序

    在Java编程语言中实现斗地主扑克牌的排序是一个涉及数据结构、算法和对象导向编程的概念的任务。斗地主是一款流行的扑克游戏,需要对牌进行特定的规则排序,以确保公平性和游戏流程的正确性。在这个场景下,我们首先...

    扑克牌中的顺子1

    这个问题要求我们判断从一副扑克牌中抽出的五张牌是否构成一个顺子,即这些牌是否按照数字顺序连续排列。在扑克牌中,数字 2 至 10 对应其自身值,A 代表 1,J 代表 11,Q 代表 12,K 代表 13,而大、小王被视为 0,...

    Java模拟三公,出牌发牌及牌型

    1. 创建扑克牌:定义一个扑克牌类,包含牌的花色(红桃、黑桃、梅花、方块)和点数(2-10、J、Q、K、A)。 2. 洗牌:使用随机数生成器对牌堆进行洗牌,确保每一轮游戏的随机性。 3. 发牌:按照预设的玩家数量,从洗...

    NullPointerC#Prepared-For-Better-Offer#剑指 Offer 61. 扑克牌中的顺子1

    如果i与i+1位置的元素相差恰好为1,那么说明此时恰为递增,故不需要用尝试用0来填充,如果否则记录下此时二者之间需要用多少张牌填充,即为$nums[i + 1]

    Lxzz24#Repo#61. 扑克牌顺子1

    61. 扑克牌顺子题目链接题目描述五张牌,其中大小鬼为癞子,牌面为 0。判断这五张牌是否能组成顺子。解题思路// 统计癞子数量// 使用癞子去补全不连续的顺子。

    wujie199#CS#61. 扑克牌顺子1

    61. 扑克牌顺子题目链接题目描述五张牌,其中大小鬼为癞子,牌面为 0。判断这五张牌是否能组成顺子。解题思路// 统计癞子数量// 使用癞子去补全不连续的顺子。

    扑克牌程序

    在本文中,我们将深入探讨如何使用Java编程语言来实现一个扑克牌程序,这涉及到扑克牌的构造、基本算法以及比较、搜索和排序等关键操作。首先,我们需要理解扑克牌的基本结构和规则,以便在代码中有效地模拟它们。 ...

    扑克牌模块1.0.rar

    1. **扑克牌数据结构**:在《扑克牌模块1.0》中,扑克牌被表示为一个数据结构,通常包括牌面(如红桃A、梅花K等)和牌值(数字1到13)。这种数据结构设计使得对扑克牌的操作变得简单直观,例如比较牌的大小、查找...

    java模拟斗地主的洗牌发牌.rar

    在Java编程语言中,模拟斗地主游戏的洗牌、发牌和看牌过程是一项有趣的实践,这有助于加深对集合框架的理解。在这个项目中,主要使用了三种集合类:HashMap、ArrayList和TreeSet,它们各自有其独特的特性和用途。 ...

    Rogerspy#LeetCode-Py-1#剑指 Offer 61. 扑克牌中的顺子1

    其中 2~10 为数字本身,A 用 1 表示,J 用 11 表示,Q 用 12 表示,K 用 13 表示,大小王用 0 表示,且大小王可以替换任意数字。解题思路

Global site tag (gtag.js) - Google Analytics