剑指offer45:扑克牌顺子

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。

2 思路和方法

  (1)首先应该对数组进行排序。

  (2)统计数组中大小王(0)出现的个数。while(numbers[index]==0) ++index; // 统计0的个数

  (3)统计数组中所有相邻数之间的间隔。

  (4)同时还需要排除对子的情况,如果出现了对子,那么肯定不可能是顺子(0除外)。

  (5)最后比较0的个数和间隔大小,如果0的个数大于等于间隔数,说明可以组成顺子。

3 C++核心代码

 1 class Solution {
 2 public:
 3     bool IsContinuous( vector<int> numbers ) {
 4         if (numbers.size() != 5)return false;
 5
 6         sort(numbers.begin(), numbers.end());
 7         int numOfZero = 0;
 8         //统计0的个数
 9         for (int i = 0; i != 5; i++) {
10             if (!numbers[i])
11                 numOfZero++;
12         }
13
14         int beg = numOfZero+1;
15         int numOfGap = 0;
16         while (beg < 5) {
17             //如果出现了对子,那么肯定不可能是连子
18             if (numbers[beg - 1] == numbers[beg])
19                 return false;
20
21             numOfGap += numbers[beg] - numbers[beg - 1] -1;
22             beg++;
23         }
24
25         return (numOfZero >= numOfGap) ? true : false;
26     }
27 };

4 C++完整代码

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4
 5 using namespace std;
 6
 7 int main() {
 8     vector<int> data{ 5,7,6,0,4 };
 9
10     if (IsContinuous(data)) {
11         cout << "is continuous."<< endl;
12     }
13     else {
14         cout << "You don‘t get lucky." << endl;
15     }
16
17     system("pause");
18     return 0;
19 }
20
21 bool IsContinuous(vector<int> numbers) {
22     if (numbers.size() != 5)return false;
23
24     sort(numbers.begin(), numbers.end());
25     int numOfZero = 0;
26     //统计0的个数
27     for (int i = 0; i != 5; i++) {
28         if (!numbers[i])
29             numOfZero++;
30     }
31
32     int beg = numOfZero+1;
33     int numOfGap = 0;
34     while (beg < 5) {
35         //如果出现了对子,那么肯定不可能是连子
36         if (numbers[beg - 1] == numbers[beg])
37             return false;
38
39         numOfGap += numbers[beg] - numbers[beg - 1] -1;
40         beg++;
41     }
42
43     return (numOfZero >= numOfGap) ? true : false;
44 }

参考资料

https://blog.csdn.net/m0_37950361/article/details/82153790

原文地址:https://www.cnblogs.com/wxwhnu/p/11423271.html

时间: 2024-10-28 14:45:57

剑指offer45:扑克牌顺子的相关文章

剑指Offer-45.扑克牌顺子(C++/Java)

题目: 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!”.L

剑指offer 扑克牌顺子

题目描述 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"

剑指Offer——扑克牌顺子

题目描述: 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"

剑指offer--41.扑克牌顺子

没有判断数组长度,导致{1,3,2,5,4}输出结果是false是什么鬼??? ------------------------------------------------------------------------ 时间限制:1秒 空间限制:32768K 热度指数:163724 本题知识点: 字符串 题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽

剑指offer——扑克牌的顺子

题目链接: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!”.

剑指:扑克牌的顺子

题目描述 从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的. 2-10 为数字本身,A 为1,J 为 11,Q 为 12,K 为 13,大小王可以看做任意数字. 为了方便,大小王均以 0 来表示,并且假设这副牌中大小王均有两张. 样例1 输入:[8,9,10,11,12] 输出:true 样例2 输入:[0,8,9,11,12] 输出:true 解法一 对数组排序: 计算出 0 的个数 zeroCount: 从第一个不是 0 的数字开始遍历,与后一个数字比较,如果相等,直接

剑指Offer44 扑克牌的顺子

1 /************************************************************************* 2 > File Name: 44_ContinuesCards.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年09月04日 星期日 19时55分44秒 6 **********************************

剑指Offer45 约瑟夫环

1 /************************************************************************* 2 > File Name: 45_LastNumberInCircle.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年09月04日 星期日 20时21分57秒 6 ******************************

剑指offer--45.二叉树的深度

时间限制:1秒 空间限制:32768K 热度指数:139716 题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution {