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

1、题目描述:

  LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何, 如果牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。

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

2、思路:

  这道题主要是换一种思路,判断是不是顺子,不用一个一个检查。只需要先将数组排序,统计好数组中0的个数,因为0是可以代替任意数字的。然后再统计好数组中的相邻的数字的gap也就是相差超过1有多大。最后,判断0的个数是否能够填满数组的gap的个数,若是能,那就是顺子,若不是就不是顺子。

3、代码:

import java.util.*;

public class Solution {
    public static void main(String[] args) {
        int[] arr = {0, 3, 2, 6, 4};
        boolean continuous = isContinuous(arr);
        System.out.println(continuous);
    }

    public static boolean isContinuous(int[] numbers) {
        //鲁棒性校验
        if (numbers == null || numbers.length == 0) {
            return false;
        }
        //先对数组进行排序
        Arrays.sort(numbers);
        int numOfZero = 0;
        int numOfGap = 0;
        //统计数组中0的个数
        for (int i = 0; i < numbers.length; i++) {
            if (numbers[i] == 0) {
                numOfZero++;
            }
        }
        //统计数组中数字间隔的个数,定义两个指针,small指针要排除掉0,也就是大小王会
        int small = numOfZero;
        int big = small + 1;
        while (big < numbers.length) {
            if (numbers[small] == numbers[big]) {
                return false;
            }
            numOfGap += numbers[big] - numbers[small] - 1;
            small = big;
            ++big;
        }
        boolean result = false;
        if (numOfGap > numOfZero) {

        } else {
            result = true;
        }
        return result;
    }
}

原文地址:https://www.cnblogs.com/guoyu1/p/12212954.html

时间: 2024-10-15 04:15:38

面试题61:扑克牌中的顺子的相关文章

如何在JS中计算扑克牌中的顺子、对子、半顺、豹子、杂六

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>如何计算扑克牌中的顺子.对子.半顺.豹子.杂六</title> 5 <meta charset="utf-8"/> 6 </head> 7 <body> 8 号码1:<input type="number" value="5" id="num1&q

【剑指offer】61、扑克牌中的顺子

题目 从扑克牌中随机抽5张牌,判断是不是一个顺子.2~10为本身,A是1,J,Q,K分别是11,12,13.大小王百搭 思路 关键就是大小王百搭.把大小王都当作0. 我们先统计出数组中0的个数 然后将数组排序,统计不连续的空缺总数 最后判断0的个数是否比空缺总数大 class Solution { public: bool IsContinuous( vector<int> numbers ) { if (numbers.size() != 5 ) return false; int leng

算法题7 判断扑克牌中的顺子

题目: 来源 http://www.cnblogs.com/python27/archive/2011/11/27/2264405.html 随机抽取扑克牌中的n张牌,判断是不是顺子,即这5张牌是不是连续的.其中A看成1,J看成11,Q看成12,K看成13,大小王可以看成任何需要的数字. 分析: 对于扑克牌来说,数字范围是很明确的,1到K外加大小王(设定为M).假如这副牌是个顺子,也就是每张牌都不相同,那么利用一个大小为14的辅助数组counts[]就可以快速的实现排序,记录每张牌出现的次数,然

44、扑克牌中的顺子

思路:将大小王设为0,5个数排序. 1.统计0个数和间隔数,空缺总数小于等于0个数说明连续. 2.且数组不能有相同的数此为对子.排序只有在n很大时才有意义.普通排序即可. import java.util.Arrays; public class Solution { public boolean isContinuous(int [] numbers) { //数组不能为空,也不能长度小于5 if (numbers == null || numbers.length < 5) { return

61-扑克牌中的顺子

题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的. def is_continous(arrys): cnt_0 = arrys.count(0) res = sorted(arrys) i,length = cnt_0,len(res) cnt = 0 while i<length-1: if res[i+1]-res[i]==0: return False if res[i+1]-res[i]>1: cnt = cnt+res[i+1]-res[i]-1 i +=

2014华为实习上级笔试题-- 统计字符串中出现的单词

#include<iostream> //#include<string> using namespace std; struct node { char word[10]; int num; }; node obj[100]; void my_word(char input[], char output[]) { int sum=0,flag=0; int i=0,j=0,k=0; while(input[i]!='\0')///////////读入单词 { if((input[

经典面试题,循环中使用闭包解决 var 定义函数的问题--闭包

闭包的定义很简单:函数 A 返回了一个函数 B,并且函数 B 中使用了函数 A 的变量,函数 B 就被称为闭包. <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>var定义函数出现的问题</title></head><body><script type="text/ja

阿里面试题:Mybatis中的Dao接口和XML文件里的SQL是如何建立关系的?

一.解析XML首先,Mybatis在初始化SqlSessionFactoryBean的时候,找到mapperLocations路径去解析里面所有的XML文件,这里我们重点关注两部分.1.创建SqlSourceMybatis会把每个SQL标签封装成SqlSource对象.然后根据SQL语句的不同,又分为动态SQL和静态SQL.其中,静态SQL包含一段String类型的sql语句:而动态SQL则是由一个个SqlNode组成. 假如我们有这样一个SQL: <select id="getUserB

LeetCode 面试题62. 圆圈中最后剩下的数字

我的LeetCode:https://leetcode-cn.com/u/ituring/ 我的LeetCode刷题源码[GitHub]:https://github.com/izhoujie/Algorithmcii LeetCode 面试题62. 圆圈中最后剩下的数字 题目 0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字