当前位置:首页 > 开发 > 互联网 > 正文

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

发表于: 2012-03-05   作者:bylijinnan   来源:转载   浏览:
摘要: package com.ljn.base; import java.util.Arrays; import java.util.Random; public class ContinuousPoker { /** * Q67 扑克牌的顺子 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。 * 2-10为数字本身,A为1,J为1
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;
    }
}

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
我要用flex实现的扑克牌选牌效果截图如下: ----------------------------------------------------
扑克牌的顺子 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 从扑克牌中随机抽取5
在作Excel表导入数据库的时候要统计成功导入了多少条,失败了多少条。 问题一:Excel表里有225行,
继 解决POI读取Excel如何判断行是不是为空 后发现了一个问题。这个是一个银行的需求,有20万个客户
在判断ComBox是否有选择条目(Item)时,判断出错,原因在于SeletedItem.ToString()存在问题,根本
1、题目名称 Valid Number(判断字符串中内容是否为数字) 2、题目地址 https://leetcode.com/probl
来源:http://mcdelfino.blog.51cto.com/2058744/661301 int.TtyParse(string s, out int i) 用来判
源码: data segment string1 db 'Please input a number:',0dh,0ah,'$' string2 db 0dh,0ah,'It is
题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是1
题目1: 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得他们的和正好是s。如果有多
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号