在n张扑克牌中找出顺子

1571. 【基础赛】游戏(game) 例如 [1,2,3,4,5,6,7] 是一个顺子,而 [1,2,4,5,6,7,8,9] 和 [1,2,2,3,4,5,6,7,8,9] 不是一个顺子。在该游戏中,顺子的定义为:点数大小连续的 m (m>1),不能中断,不能重复。他现在有 n ,每的点数为 ai​,他希望凑出尽可能多的顺子。对于100% 的数据,1≤N≤1000,1≤ai​≤100。第二行输入 N 个数,表示每的点数 ai​。第一行输入一个正整数 N ,表示的个数。对于30% 的数据,1≤N≤10。 阅读详情

        这是今天在论坛看到的一个题目,挺有意思的,我做了一下,得了28分。呵呵,很有成就感,干脆写到博客里面算了。

       题目是这样的:有n张扑克牌,每张牌的取值范围是:2,3,4,5,6,7,8,9,10,J,Q,K,A。在这n张牌中找出顺子(5张及5张以上的连续的牌),并将这些顺子打印出来。

        思路:我的思路其实很简单,首先就是要去掉重复的牌,因为同样的顺子之算一个,显然JAVA中的Set很适合这个工作。同时又需要对这些牌进行排序,毫无疑问就是TreeSet了。然后从小到大遍历这些牌,并设置一个计数器count。若发现连续的牌,则count++;若发现不连续的,分2中情况:若count>4,则找到了一个顺子,存起来;反之则什么都不做。然后count=1,从新开始找顺子。下面就是代码:

import java.util.ArrayList;
import java.util.TreeSet;

public class Main {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {

        String[] cards 
= {"6""2" ,"3" ,"7" ,"4""5""8""8""10""10""10""J""K""Q""A"};
        TreeSet
<Integer> set = init(cards);    //将字符串表示的扑克牌转换为数字,便于处理
        ArrayList<String> result = check(set);    //找出顺子
        printResult(result);    //打印顺子
        System.out.println("程序结束!!");
    }

    
    
private static TreeSet<Integer> init(String[] cards) {
        TreeSet
<Integer> set = new TreeSet<Integer>();
        
for(String s:cards) {
            
if(s.charAt(0)>='1'&&s.charAt(0)<='9'{
                set.add(Integer.parseInt(s));
            }
else {
                
switch(s.toUpperCase().charAt(0)) {
                
case 'J':
                    set.add(
11);    break;
                
case 'Q':
                    set.add(
12);    break;
                
case 'K':
                    set.add(
13);    break;
                
case 'A':
                    set.add(
14);    break;
                }

            }

        }

        
return set;
        
    }

    
    
private static ArrayList<String> check(TreeSet<Integer> set) {
        ArrayList
<String> result = new ArrayList<String>();
        StringBuilder temp 
= new StringBuilder();
        
int count = 0;
        Integer[] nums 
= new Integer[1];
        nums 
= set.toArray(nums);
        
int begin = 0;
        
for(Integer i:set) {
            
if(count == 0{
                begin 
= i;
                count
++;
                temp.append(numToCard(begin));
            }
else if(i == begin+count) {
                temp.append(
""+numToCard(i));
                count
++;
            }
else {
                
if(count>4{
                    result.add(temp.toString());
                }

                begin 
= i;
                temp.replace(
0, temp.length(), numToCard(i)+"");
                count 
= 1;
            }

        }

        
        
if(count>4)        result.add(temp.toString());
        
return result;
    }

    
    
private static String numToCard(int x) {
        
if(x>10{
            
switch(x) {
            
case 11:
                
return "J";
            
case 12:
                
return "Q";
            
case 13:
                
return "K";
            
case 14:
                
return "A";
            }

        }
else {
            
return x+"";
        }

        
return null;
    }

    
                     
//可以将长顺子分解为短顺子的打印模式
    private static void printResult1(ArrayList<String> result) {

        
int count = 0;
        String[] nodes 
= null;
        
if(result.size() == 0{
            System.out.println(
"没有顺子!!");
        }
else {
            
for(String s:result) {
                nodes 
= s.split(",");
                count 
+= (1+(nodes.length-4))*(nodes.length-4)/2;
            }

            System.out.println(
"共有"+count+"个顺子:");
            
for(String s:result) {
                nodes 
= s.split(",");
                
for(int i=5; i<=nodes.length; i++)
                    
for(int j=0; i-j>4; j++{
                        System.out.print(nodes[j].trim());
                        
for(int x = j+1; x<i; x++{
                            System.out.print(
"," + nodes[x]);
                        }

                        System.out.println();
                    }

            }

        }

    }


                     
//不将长顺子进行分解的打印模式
    private static void printResult2(ArrayList<String> result) {
        
if(result.size() == 0{
            System.out.println(
"没有顺子!!");
        }
else {
            System.out.println(
"共有"+result.size()+"个顺子:");
            
for(String s:result) {
                System.out.println(s);
            }

        }

    }

}

 

华为OD机试 - 斗地主之顺子Java 2025 A卷 200分) 每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。 阅读详情

相关推荐

华为OD机试 - 斗地主之顺子Java

而{J,Q,K,A,2}、 {2,3,4,5,6}、{3,4,5,6}、{3,4,5,6,8}等都不是顺子。当把五顺子找完后,继续检查total 是否大于 0,若total > 0,则说明还有剩余,此时我们外层遍历每一个顺子,内层遍历每一个剩余,如果剩余可以追加到顺子尾巴,形成新顺子,则更新顺子尾巴。在斗地主扑克牌游戏中, 扑克牌由小到大的顺序为:3,4,5,6,7,8,9,10,J,Q,K,A,2,玩家可以出的扑克牌阵型有:单、对子、顺子、飞机、炸弹等。

qq_34143141的博客 707

判断7扑克牌是否含有同花顺(5同花顺子

5面数字连续,则是顺子,花色相同为同花,花色相同且数字连续,则是同花顺。扑克牌四种花色♠,♥,♣,◆,每个花色从A到K共13,一共4*13=52。用0-51表示这52,按照顺序,♠A-♠K为0-12,♥A-♥K为13-25,♣A-♣K为26-38,◆A-◆K为39-51。一副,发出7,存于数组arr中,实现一个函数返回true或false判断是否有同花顺......

xh213yeah_的博客 2570

斗地主之顺子

注意!答案仅作为参考(实际考试中下列代码通过用例100%,但不代表最优解) 在斗地主扑克牌游戏中, 扑克牌由小到大的顺序为:3,4,5,6,7,8,9,10,J,Q,K,A,2,玩家可以出的扑克牌阵型有:单、对子、顺子、飞机、炸弹等。 其中顺子的出规则为:由至少5由小到大连续递增的扑克牌组成,且不能包含2。 例如:{3,4,5,6,7}、{3,4,5,6,7,8,9,10,J,Q,K,A}都是有效的顺子;而{J,Q,K,A,2}、 {2,3,4,5,6}、{3,4,5,6}、{3,4,5,6,8}等都

weixin_44219664的博客 1万+

剑指Offer——扑克牌中的顺子(JS实现)

题目描述 解题思路 本题采用的是通过零数组来辅助判断是否顺子 具体的过程,代码注释中都有 解题代码 var isStraight = function (nums) { // 将nums数组中所有0元素放入下面的数组中 const zeroArr = []; // 将数组从小到大进行排序 nums.sort((num1, num2) => num1 - num2); // 将含零的元素添加到0的数组中 for (let i = 0; i <

Always-Learning 559

python纸游戏_扑克牌游戏中, 使用python实现一个查找顺子的算法

扑克牌游戏中, 需要实现一个查找顺子的算法:(连续的数字即为顺子), 随机发N, 从中挑出最长的顺子, 并返回其长度, 如果没有顺子返回0. 现在手上的为[12,3,4,10,6,5,6,8,11,9,11,11,9,12,1].# 1.去重,排序m= [12,3,4,10,6,5,6,8,11,9,11,11,9,12,1]m.sort()s = set(m)m1 = list(s)# ...

weixin_39999781的博客 1028

面试题44:扑克牌顺子

题目:从扑克牌中随机抽5判断是不是一个顺子,即这5是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成是任意数字。 思路: 1,首先把数组排序,然后统计数组中0的个数和数组中不连续数之间的距离。如果空缺距离小于或者等于0的个数,则是连续的。否则是非连续的。 2,判断条件 a,数组为空 b,长度《1 c,相同数字不连续(重要) 代码: #

lskyne的专栏 2013

扑克牌顺子

题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副原本是54^_^)...他随机从中抽出了5,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K...

camillect的博客 176

《剑指offer》面试题61:扑克牌中的顺子

更多剑指offer面试习题请点击:《剑指offer》(第二版)题集目录索引 一、题目 二、解题思路 三、代码实现 四、测试代码 五、测试结果 一、题目   从扑克牌中随机抽5判断是不是一个顺子,即这5是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。 二、解题思路   这里我们可以把五看作一个数组,数组里面有五...

Tianzez的博客 674

【leetcode刷题】42.扑克牌中的顺子——Java

本题出自陌陌二面

公号:一条coding 1万+

【剑指offer】扑克牌顺子

九度上把这道题目改成了一副扑克牌有4大小王,这里姑且不管它最多几个0,就题目来说,不严谨,很含糊,比如这里没有对顺子给出比较严谨的定义,5个以下的连续数字算是顺子吗?现实中要至少5个才算顺子的,而且如果假设3个也算顺子,那如果输入的是3个0呢,这有点太牵强了!看论坛里面好多人吐槽。总之,不管那么多,这道题目无论它怎么坑爹,用剑指offer上的思路写的代码AC是没问题的,因为这里不管你0有多少个(只要不大于数组的长度就可)都OK。 我之前想避开排序,或者开辟哈希数组,就遍历一遍求出最大值,最小值,

兰亭风雨的专栏 5122

校招算法笔面试 | 扑克牌顺子

牛客题库题解

wc529065的博客 996

扑克牌顺子(C++)

  现在有2副扑克牌,从扑克牌中随机五扑克牌,我们需要来判断一下是不是顺子。 有如下规则:要求:空间复杂度 O(1),时间复杂度 O(nlogn),本题也有时间复杂度 O(n) 的解法输入五扑克牌的值五扑克牌能否组成顺子。......

田螺姑娘的博客 2195

23 判断扑克牌顺子

前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路对于这个问题, 书中给出了一种思路思路一 : 先将数组进行排序, 然后获取到第一个非0元素的位置, 然后获取之后的元素的每两个相邻元素之间的差值[“空白元素部分”], 相邻两个元素相同为剪枝条件[根据题目的需求], 可以直接返回false, 统计所有的”空白元素”的个数, 最后比较总的”空白元素”的个数 和数组前面”0的个数”,

970655147的专栏 1165

数据结构与算法--判断扑克牌是否顺子

扑克牌顺子 题目:从扑克牌中随机抽取N判断是否顺子,即这N是不是连续的。扑克牌中2 ~ 10 为数字,11代表j,12代表k,13代表K,并且大小王可以代表任意数字。 抽象概念 将扑克牌抽象成计算机语言,数字自然好处理,n用 n 个元素的数组标识,大小王特殊数字,我们用0 标识。 分析: 用数组标识,那么问题变为判断数组是否连续,最直观就是排序了 此处有特殊因素0,也就是即使不连续,但是差值 小于 0 的个数还是看成连续 有对子必然不是顺子,除了0 以外 案例{2,3,4,

0102的博客 1044

java实现斗地主(附完整源码)

java实现斗地主(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 2298

华为OD机试(JAVA)真题 -- 斗地主

斗地主起源于湖北十堰房县,据传是一位叫吴修全的年轻人根据当地流行的扑克玩法“跑得快”改编的,如今已风靡整个中国,并流行于互联网上

dream_young_boy的博客 741

剑指offer——扑克牌顺子C++

先排序,然后遍历该数组,计算大小王个数。然后再次遍历,判断连续两个数字是否有相同的,如果有就直接false。如果不同就将flag - (后一个数字-前一个数字-1),比如1,2,flag减去的就是0,就是不消耗大小王。如果是1,3那么flag-1,就是要消耗掉一个大小王。最后判断flag是否小于0,如果小于0,就是false class Solution { public: bool IsContinuous( vector<int> numbers ) { //用se.

白小飞 338
上一篇: JList用法小结
下一篇: 将一个单向链表反向链接
andycpp
博客等级 码龄22年 699粉丝 72原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值