剑指offer45:扑克牌顺子

Posted wxwhnu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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 ;
View Code

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 
View Code

参考资料

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

以上是关于剑指offer45:扑克牌顺子的主要内容,如果未能解决你的问题,请参考以下文章

[剑指Offer] 45.扑克牌顺子

[剑指offer] 45. 扑克牌顺子

45剑指offer--扑克牌顺子

剑指offer系列——45.扑克牌顺子

剑指offer 45.抽象建模能力 扑克牌顺子

剑指offer(三十)之扑克牌顺子