程序员面试题精选100题(40)-扑克牌的顺子

2023-11-04

程序员面试题精选100题(40)-扑克牌的顺子

  题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A1J11Q12K13,而大小王可以看成任意数字。

         分析:这题目很有意思,是一个典型的寓教于乐的题目。

         我们需要把扑克牌的背景抽象成计算机语言。不难想象,我们可以把5张牌看成由5个数字组成的数组。大小王是特殊的数字,我们不妨把它们都当成0,这样和其他扑克牌代表的数字就不重复了。

         接下来我们来分析怎样判断5个数字是不是连续的。最直观的是,我们把数组排序。但值得注意的是,由于0可以当成任意数字,我们可以用0去补满数组中的空缺。也就是排序之后的数组不是连续的,即相邻的两个数字相隔若干个数字,但如果我们有足够的0可以补满这两个数字的空缺,这个数组实际上还是连续的。举个例子,数组排序之后为{01345}。在13之间空缺了一个2,刚好我们有一个0,也就是我们可以它当成2去填补这个空缺。

         于是我们需要做三件事情:把数组排序,统计数组中0的个数,统计排序之后的数组相邻数字之间的空缺总数。如果空缺的总数小于或者等于0的个数,那么这个数组就是连续的;反之则不连续。最后,我们还需要注意的是,如果数组中的非0数字重复出现,则该数组不是连续的。换成扑克牌的描述方式,就是如果一副牌里含有对子,则不可能是顺子。

         基于这个思路,我们可以写出如下的代码:

// Determine whether numbers in an array are continuous

// Parameters: numbers: an array, each number in the array is between

//             0 and maxNumber. 0 can be treeted as any number between

//             1 and maxNumber

//             maxNumber: the maximum number in the array numbers

bool IsContinuous(std::vector<int> numbers, int maxNumber)

{

    if(numbers.size() == 0 || maxNumber <=0)

        return false;

 

    // Sort the array numbers.

    std::sort(numbers.begin(), numbers.end());

 

    int numberOfZero = 0;

    int numberOfGap = 0;

 

    // how many 0s in the array?

    std::vector<int>::iterator smallerNumber = numbers.begin();

    while(smallerNumber != numbers.end() && *smallerNumber == 0)

    {

        numberOfZero++;

        ++smallerNumber;

    }

 

    // get the total gaps between all adjacent two numbers

    std::vector<int>::iterator biggerNumber = smallerNumber + 1;

    while(biggerNumber < numbers.end())

    {

        // if any non-zero number appears more than once in the array,

        // the array can't be continuous

        if(*biggerNumber == *smallerNumber)

            return false;

 

        numberOfGap += *biggerNumber - *smallerNumber - 1;

        smallerNumber = biggerNumber;

        ++biggerNumber;

    }

 

    return (numberOfGap > numberOfZero) ? false : true;

}

         本文为了让代码显得比较简洁,上述代码用C++的标准模板库中的vector来表达数组,同时用函数sort排序。当然我们可以自己写排序算法。为了有更好的通用性,上述代码没有限定数组的长度和允许出现的最大数字。要解答原题,我们只需要确保传入的数组的长度是5,并且maxNumber13即可。


测试程序:
//在编程的过程中,我们可以利用最大值和最小值的差来进行简单的判断,利用
//set的不重复性可以避免排序。
#include<iostream>
#include<set>
#include<vector>
using namespace std;


void GetMaxMin(const set<int> &setNum,int &nMax,int &nMin)
{
  set<int>::const_iterator iter=setNum.begin();
  for(;iter!=setNum.end();iter++)
  {
    if(*iter<nMin)
nMin=*iter;
    if(*iter<nMax)
nMax=*iter;
  }
}


int Del0Num(set<int>& setNum,const vector<int> &data)
{
  int Num0=0;
  vector<int>::const_iterator iter=data.begin();
  for(;iter!=data.end();iter++)
  {
    if(*iter!=0)
setNum.insert(*iter);
else
Num0++;
  }
  return Num0;
}


bool IsContinuous(vector<int> data)
{
  int nMax=0,nMin=0;
  set<int> setNum;
  int num0=Del0Num(setNum,data);
  //下面判断有没有对子
  if(num0+setNum.size()<data.size())
 return false;
   GetMaxMin(setNum,nMax,nMin);
   return nMax-nMin<=data.size()-1;
}


int main()
{
  vector<int> vec;
  for(int i=0;i<5;i++)
  {
    int temp;
cin>>temp;
vec.push_back(temp);
  }
  cout<<IsContinuous(vec);
  return 0;
}
参考来源:《剑指offer名企面试官精讲典型编程题》——何海涛
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序员面试题精选100题(40)-扑克牌的顺子 的相关文章

  • 归并排序,自顶向下,自底向上

    http blog csdn net cjf iceking article details 7920153
  • # 洗牌算法

    基本概念 等概率将将一个数组N打乱 概率每次都是1 N 加上 方法一 全局洗牌 从 0到N 1的数组下标 每次随机产生两个0到 N 1之间的数 进行交换 void get rand number int array int length i
  • 数学,金融,计算机优秀博客

    数学 金融 计算机优秀博客 网址 http zhiqiang org blog link 阅微堂 阅微堂认同的优秀博客标准为 有更新 原创 一年以前的文章还有价值 数学 谢松 木遥 Han Yan 统计之都 张驰原 李淼 科学松鼠会 卢昌海
  • Nvidia-docker运行错误- Nvidia-docker : Unknown runtime specified nvidia

    使用nvidia docker的时候 出现了上面的bug 故总结一下 所使用的环境为ubuntu系统64位 GPU2080ti command1 sudo nvidia docker run e NVIDIA VISIBLE DEVICES
  • 算法基础--递归与回溯、递推、迭代关系

    递归的优缺点 优点 代码更简洁清晰 可读性更好 实际上递归的代码更清晰 但是从学习的角度要理解递归真正发生的什么 是如何调用的 调用层次和路线 调用堆栈中保存了什么 可能是不容易 但是不可否认递归的代码更简洁 缺点 由于递归需要系统堆栈 所
  • 一道创新工场面试题详解:共打了多少鱼?

    一道创新工场面试题详解 共打了多少鱼 题目 abcde五人打渔 打完睡觉 a先醒来 扔掉1条鱼 把剩下的均分成5分 拿一份走了 b再醒来 也扔掉1条 把剩下的均分成5份 拿一份走了 然后cde都按上面的方法取鱼 问他们一共打了多少条鱼 解法
  • 编程珠玑第三章习题5——英语中的连字符问题

    编程珠玑第三章习题5 英语中的连字符问题 问题 本问题将处理一小部分用连字符连接的英语单词方面的问题 下面的规则列表描述了一些以字母c结尾的单词的有效连字符连接 et ic al is tic s tic p tic lyt ic ot i
  • 线性时间内从一个数组中找出第K个最小的元素——编程珠玑

    线性时间内从一个数组中找出第K个最小的元素 编程珠玑 题目 编写程序 在O n 时间内从数组x 0 n 1 中找出第k个最小的元素 算法中可以对x中的元素进行排序 思路 快速排序选择一个pivot对数组进行划分 左边小于pivot 右边大于
  • 算法设计艺术——编程珠玑第八章

    算法设计艺术 编程珠玑第八章 下面是书本中讲解的四个算法 问题 求一维数组中连续子向量的最大和 例如 a 6 3 4 2 9 10 8 则最大连续子向量的和 为 10 8 18 1 解法一 简单算法 html view plain copy
  • 图 深度优先遍历 广度优先遍历 非递归遍历 图解算法过程

    图的邻接矩阵表示 通常图的表示有两种方法 邻接矩阵 邻接表 本文用邻接矩阵实现 一是代码量更少 二是代码风格也更贴近C语言 但不论是图的哪种实现方式 其基本的实现思想是不变的 1 节点的信息 我们用一维数组a n 来存储 假设图共有n个节点
  • 编写一个"banner"函数,该函数的输入为大写字母

    编写一个 banner 函数 该函数的输入为大写字母 题目 编写一个 banner 函数 该函数的输入为大写字母 输出为一个字符数组 该数组以图像化的方式表示该字母 编程 珠玑 上提到当要 输入 的 数据 很多 且没有 规律 时 可以 考虑
  • 迁移学习概述

    1 迁移学习的背景 在有监督的机器学习和尤其是深度学习的场景应用中 需要大量的标注数据 标注数据是一项枯燥无味且花费巨大的任务 关键是现实场景中 往往无法标注足够的数据 而且模型的训练是极其耗时的 因此迁移学习营运而生 传统机器学习 主要指
  • 机器学习(machine learning)之AdaBoost算法

    转载自 http blog csdn net haidao2009 article details 7514787 菜鸟最近开始学习machine learning 发现adaboost 挺有趣 就把自己的一些思考写下来 主要参考了http
  • 【数学基础】 线性代数以及符号编总

    1基本概念和符号 线性代数可以对一组线性方程进行简洁地表示和运算 例如 对于这个方程组 这里有两个方程和两个变量 如果你学过高中代数的话 你肯定知道 可以为x1 和x2找到一组唯一的解 除非方程可以进一步简化 例如 如果第二个方程只是第一个
  • Java算法基础:使用递归算法实现,平方相加1^2 + 2^2 + 3^2 +...+ n^2。

    package algorithm recursion public class RecursionTest public static void main String args int m 5 int sumOfSquares sumO
  • 基础算--简单枚举

    简单枚举 顾名思义 枚举便是依次列举出所有可能产生的结果 根据题中的条件对所得的结果进行逐一的判断 过滤掉那些不符合要求的 保留那些符合要求的 也可以称之为暴力算法 枚举结构 循环 判断语句 应用场合 在竞赛中 并不是所有问题都可以使用枚举
  • 程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表

    程序员面试题精选100题 01 把二元查找树转变成排序的双向链表 参见博客 http zhedahht blog 163 com blog static 254111742007127104759245 http www cnblogs c
  • 中文分词之HMM模型详解

    关于HMM模型的介绍 网上的资料已经烂大街 但是大部分都是在背书背公式 本文在此针对HMM模型在中文分词中的应用 讲讲实现原理 尽可能的撇开公式 撇开推导 结合实际开源代码作为例子 争取做到雅俗共赏 童叟无欺 没有公式 就没有伤害 模型介绍
  • 程序员面试题精选100题(30)-赋值运算符重载函数[C/C++/C#]

    程序员面试题精选100题 30 赋值运算符重载函数 C C C 问题 给出如下CMyString的声明 要求为该类型添加赋值运算符函数 class CMyString public CMyString char pData NULL CMy
  • CRC-模2除法

    在循环冗余校验码 CRC 的计算中有应用到模2除法 模2除法的特点就是 每一位除的结果不影响其它位 即不向上一位借位 模2除法原则 1 被除数的首位为1 商为1 2 被除数的首位为0 商为0 3 模2除法等同于按位异或 要保证每次除完首位都

随机推荐

  • mybatis-plus教程-Mybatis-Plus增删改查

    完整代码 https github com pbteach mybatis plus test Mybatis plus增删改查 通过前面的学习 我们了解到通过继承BaseMapper就可以获取到各种各样的单表操作 接下来我们将详细讲解这些
  • 【100%通过率 】【华为OD机试c++】去除多余空格【 2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 去除多余空格 去除文本多余空格 但不去除配对单引号之间的多余空格 给出关键词的起始和结束下标 去除多余空格后刷新关键词的起始和结束下标
  • java long格式化输出,java格式化输出

    importjava text DecimalFormat publicclassTestNumberFormat publicstaticvoidmain String args doublepi 3 1415927 圆周率 取一位整数
  • 在vue中使用图片编辑插件ToastUI Image Editor

    简介 ToastUI Image Editor 是一个基于 HTML5 Canvas 的图片编辑器 它使用起来非常简单 而且内置了丰富的图片编辑功能 它支持原生 JavaScript Vue 组件 和 React 组件三种使用方式 官网地址
  • 通过stream()方法,一条代码计算List集合中相同字段的结果。

    一 下面写了一个例子 定义一个User类 package com newframe controllers api import lombok Data import java math BigDecimal author wangdong
  • (每日一题)丑数

    判断数是否为丑数 给你一个整数 n 请你判断 n 是否为 丑数 如果是 返回 true 否则 返回 false 丑数 就是只包含质因数 2 3 和 或 5 的正整数 方法一 数学思维 class Solution def isUgly se
  • 正在检测服务器信息吗,云服务器会检测内容吗

    云服务器会检测内容吗 内容精选 换一换 创建一台按需弹性云服务器 弹性云服务器创建完成后 如需开启自动恢复功能 可以调用配置云服务器自动恢复的接口 具体使用请参见管理云服务器自动恢复动作 该接口在云服务器创建失败后不支持自动回滚 若需要自动
  • 虚拟机挂起后docker容器web页面无法访问

    博主的Jenkins master部署在机器上的docker容器中 虚拟机挂起后访问jenkins master的ip发现一直timeout 虚拟机在挂起或者重启后 采用桥接网卡的网络设置会发生变更 此时需要永久保留虚拟机的网络配置 介绍两
  • 画一个 “月饼” 陪我过中秋,玩转炫彩 “月饼” 之 基本测试

    自己的画的炫彩 月饼 到了 本文就开始带大家来玩玩我们自己的月饼 by 矜辰所致 前言 板子昨天就到了 下了班抽空把板子焊接了一下 本文就来分享一下拿到 PCB 板子后开始的测试过程 也当做给初学者一个教学 本 月饼 的原理图和 PCB 设
  • web3d练习

    要求 使用6张图片 组成一个3d的立方体 使得在页面上进行转动显示出来 并且 当鼠标放在这个立方体上面 这6张图片就直接炸开 代码 主要用到transfrom进行位移和旋转 使用transform style preserve 3d 开启使
  • Node.js模块加载及第三方包的使用--学习笔记

    文章目录 一 Node js模块化开发 1 1 JavaScript开发弊端 1 2 软件中的模块化开发 1 3 Node js中模块化开发规范 1 4 模块成员导出的另一种方式 二 系统模块 2 1 什么是系统模块 2 2 系统模块fs
  • 子线程中的异常捕获

    根据 线程的本质 当一个线程抛出异常时 在主线程中加try catch 是无法捕获到其抛出的异常的 如下面代码所示 private static final String TAG MainActivity Override protecte
  • 三星手机点击事件不执行或偶尔执行

    这个问题还真是也头疼呢 ScrollView嵌套RecycleView 没有滑动事件 最多显示四个item 然后三星S6手机点击事件有问题 最后发现是监听ScrollView滑到底部的时候拦截了点击事件 在某些手机上出现了不兼容的情况 感谢
  • Java中两个string字符串判断是否相同

    1 使用equals 方法 建议使用这个 使用equals 方法比较两个字符串的内容是否相同 这是最常用的字符串比较方法 它比较字符串的内容是否一致 而不仅仅是比较引用 String str1 Hello String str2 Hello
  • tomcat处理高并发的一些探索

    一 tomcat的三个重要配置 1 maxConnections 最大连接数 解释 在同一时间下 tomcat能够接收的最大连接数 默认值 java的阻塞式BIO 默认值是maxthreads的值 在BIO使用定制的Executor执行器
  • 百度版ChatGPT:文心一言发布会盛大召开!

    今天下午2点 万众期待的百度版ChatGPT 文心一言发布会召开了 图一 投资者对这个发布会的反应非常直接 股价当场断崖式下跌 图二 和ChatGPT发布会上现场功能演示不同 百度发布会的所有功能演示都是提前录制好的 而且也不对大众开放 只
  • Mysql的if case 使用

    Mysql的if既可以作为表达式用 也可在存储过程中作为流程控制语句使用 如下是做为表达式使用 IF表达式 IF expr1 expr2 expr3 如果 expr1 是TRUE expr1 lt gt 0 and expr1 lt gt
  • 基于python的接口自动化测试,最简单实用的教学!

    一 简介 本文从一个简单的登录接口测试入手 一步步调整优化接口调用姿势 然后简单讨论了一下接口测试框架的要点 最后介绍了一下我们目前正在使用的接口测试框架 pithy 期望读者可以通过本文对接口自动化测试有一个大致的了解 二 引言 为什么要
  • 图解通信原理与案例分析-14:“大哥大”与1G模拟蜂窝移动通信案例--频率调制与频分多址FDMA

    前言 在前面的案例中 拆解的是在单个无线信道上 通过模拟幅度调制或模拟频率调制 实现一对一 点对点语音通信 本文将进一步拆解 通过模拟频率调制与频分多址技术 把一定带宽频谱资源切分成多个无线通道上 实现多用户同时语音通信 从单用户通信单元过
  • 程序员面试题精选100题(40)-扑克牌的顺子

    程序员面试题精选100题 40 扑克牌的顺子 题目 从扑克牌中随机抽5张牌 判断是不是一个顺子 即这5张牌是不是连续的 2 10为数字本身 A为1 J为11 Q为12 K为13 而大小王可以看成任意数字 分析 这题目很有意思 是一个典型的寓