扑克牌顺子(C++)
扑克牌顺子
描述
现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。
有如下规则:
- A为1,J为11,Q为12,K为13,A不能视为14
- 大、小王为 0,0可以看作任意牌
- 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。
- 数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0, 13]
要求:空间复杂度 O(1),时间复杂度 O(nlogn),本题也有时间复杂度 O(n) 的解法
输入描述:
输入五张扑克牌的值
返回值描述:
五张扑克牌能否组成顺子。
示例1
输入:
[6,0,2,0,4]
返回值:
true
说明:
中间的两个0一个看作3,一个看作5 。即:[6,3,2,5,4]
这样这五张牌在[2,6]区间连续,输出true
示例2
输入:
[0,3,2,6,4]
复制
返回值:
true
示例3
输入:
[1,0,0,1,0]
返回值:
false
示例4
输入:
[13,12,11,0,1]
返回值:
false
思路/解法
方式一
利用辅助数组记录当前已经出现的数同时可以高效判断是否该数重复(除0外)。利用两个标记位纪录当前最小值下标和最大值下标,以及使用一个临时标记位记录大小王出现的次数,模拟重新遍历一次numbers数组,即可得知是否为顺子。
class Solution {public:bool IsContinuous(vector<int> numbers) {int visited[14]{0};//辅助数组,用于记录数组(哈希思想)int startIndex,endIndex;//用于记录当前最小值下标和最大值下标int zeroCount = 0;//记录大小王出现的次数bool flag = true;//numbers一开始出现0的时候,我们不能对startIndex和endIndex初始化,直至不出现零才对startIndex和endIndex进行初始化for(int i = 0;i<numbers.size();i++){if(numbers[i] != 0 && flag)//对startIndex和endIndex进行初始化,前提是该位的数不是大小王{startIndex = i;endIndex = i;visited[numbers[i]]++;//visited相应下标所对应的值++flag = false;continue;}else if(numbers[i] == 0)//如果为大小王{zeroCount++;continue;}else if(numbers[startIndex] > numbers[i])//判断当前位置的数是否比startIndex记录位置的数小startIndex = i;else if(numbers[endIndex] < numbers[i])//判断当前位置的数是否比endIndex记录位置的数大endIndex = i;if(visited[numbers[i]] != 0)//除0外,如果其它数重复则直接返回falsereturn false;visited[numbers[i]]++;//否则visited相应下标所对应的值++}//模拟查看是否为顺子,此时由于大小王可以表示任意数字,所以得考虑大小王的数目for(int i = numbers[startIndex];i < numbers[endIndex];i++){if(visited[i] == 0 && zeroCount){zeroCount--;continue;}if(visited[i] == 0 && !zeroCount)return false;}return true;}
};
方式二
每次抽取牌的数量为5,因此若非零牌中的最大值与最小值之差小于5,则一定会组成顺子。因此,题目转变成为:在非零牌中,寻找最大牌与最小牌,并计算其距离是否小于5。
思路如下:
- 将原数组排序(可利用C++内置的sort()方法进行排序);
- 可以得到数组中的最大数max(即有序数组的最后一个元素);
- 从头开始遍历排序好的数组:
- 若遇到0,跳过;
- 若遇到重复元素,返回false;
- 若max与当前值之差大于4,返回false;
- 循环结束时,比满足「最大值与最小值之差小于等于4」、「不存在重复元素」,因此直接返回true。
class Solution {public:bool IsContinuous(vector<int> numbers) {sort(numbers.begin(), numbers.end()); // 排序int i = 0, max_ = numbers[numbers.size() - 1]; // 最大值为数组的最后一个元素while(i < numbers.size() -1){//跳过0if(numbers[i] == 0){i++;continue;}//若有重复,返回falseif(numbers[i] == numbers[i+1])return false;//若最大与最小值之差大于4,返回falseif(max_ - numbers[i] > 4)return false;i++;}return true;}
};
扑克牌顺子(C++)相关推荐
- 剑指Offer(Java实现)扑克牌顺子
扑克牌顺子 题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)-他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话, ...
- 《剑指offer》-- 栈的压入与弹出序列、把字符串转化为整数、扑克牌顺子、孩子们的游戏(圆圈中最后剩下的数)
一.栈的压入与弹出序列: 1.题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序. 假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序 ...
- 牛客题霸 [扑克牌顺子] C++题解/答案
管理博文 牛客题霸 [扑克牌顺子] C++题解/答案 题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)-他随机从中抽出了5张牌,想测测自己 ...
- java变量小明扑克牌_算法练习篇之:扑克牌顺子
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 代码实现 import java.util.Arrays; public class isContinuous { //扑克牌顺子(必须连续的五个数字) ...
- 剑指offer——面试题44:扑克牌顺子
剑指offer--面试题44:扑克牌顺子 Solution1: 20180907重做 书上的思路. class Solution { public:bool IsContinuous(vector&l ...
- 【剑指offer{40-44}】和为S的连续正数序列、和为S的两个数字、左旋转字符串、翻转单词顺序列、扑克牌顺子
文章目录 和为S的连续正数序列 题目描述 C++代码 和为S的两个数字 题目描述 C++代码 左旋转字符串 题目描述 C++代码 翻转单词顺序列 题目描述 C++代码 扑克牌顺子 题目描述 C++代码 ...
- JZ45 扑克牌顺子
JZ45 扑克牌顺子 JZ45 扑克牌顺子 问题描述 问题分析 解法 JZ45 扑克牌顺子 问题描述 现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子. 有如下规则: A为1, ...
- java面试(二十五)--(1)redis为什么读写速率快性能好(2)说说web.xml文件中可以配置哪些内容(3)和的区别(4)扑克牌顺子
1. redis为什么读写速率快性能好? 1.Redis将数据存储在内存上,避免了频繁的IO操作 2.Redis其本身采用字典的数据结构,时间复杂度为O(1),且其采用渐进式的扩容手段 3.Redis ...
- 扑克牌顺子java_算法练习篇之:扑克牌顺子
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 代码实现 import java.util.Arrays; public class isContinuous { //扑克牌顺子(必须连续的五个数字) ...
最新文章
- Java Application和Java Applet
- Intellij Idea打包jar
- NodeJS Stream 五:双工流
- ADC和DAC中常见技术术语
- 电子地图市场现状研究分析报告 -
- 2016年人人网笔试题
- php网站挂马,转 :php 网站挂马检查
- VUE 组件手动渲染、组件延迟渲染
- python制作微信小程序_python搭建微信小程序
- 各位,我来自数位红公司,我们是做手机游戏的。
- Go string类型及其使用
- postman调试http接口挑战鉴权Authorization
- 晋升到头了,怎么办?
- MongoDB 排序
- 第 2 届河北省大学生程序设计竞赛(河北省赛)-Problem G. 520-题解
- 计算机专业英语祈使句,常见英语祈使句类型解析,分类对比轻松学
- 2016年,安防大佬们活得都还好吗?
- 【第三方互联】13、码云(Gitee)授权第三方登录
- 机器学习算法-PageRank(排序)
- Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.Depe