剑指offer 69. 扑克牌的顺子
题目描述
从扑克牌中随机抽 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
方法一:排序+遍历 O(n)=O(5)=O(1)
思路如下:
- 先排除容器为空的情况,然后将所有数进行排序。
- 去掉 0 ,从前找到第一个非 0 的数。
- 除 0 以外的数中不能出现重复的数字,不然不满足顺子要求。
- 最后再判断除 0 以外的数中的最大值和最小值之差是否等于 4 ,因为最多只有 5 张牌,如果差值超过 4 则无法用足够的 0 去填补(最多只有 4 个 0)。例如,差值为 5 ,那么非 0 的数占 2 个,即使剩下的 3 个数都为 0 ,但至少也需要 4 个 0 才能填补构成顺子。
注意: 题目假设大小王各有两张,故最多可能出现 4 个 0 。
class Solution { public: bool isContinuous(vector<int> numbers) { if (numbers.empty()) return false; sort(numbers.begin(), numbers.end()); //将0排除掉 int k = 0; while (!numbers[k]) k++; //不能出现相等的数 for (int i = k + 1; i < numbers.size(); i++) if (numbers[i] == numbers[i - 1]) return false; //最大值与最小值之差必须在4以内 return numbers.back() - numbers[k] <= 4; } };
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
一个学生关于鸿蒙系统的一些看法