剑指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

posted @ 2019-08-28 12:06  wxwreal  阅读(146)  评论(0编辑  收藏  举报