C++面试题(48)------ 扑克牌中的顺子
- 操作系统:ubuntu22.04
- IDE:Visual Studio Code
- 编程语言:C++11
题目描述
从扑克牌中随机抽 5 张牌,判断是不是一个顺子(即是否连续的五个点数)。
A 看作 1,J=11,Q=12,K=13,大小王可以看作任意数字(用 0 表示)。
示例:
输入: [1,2,3,4,5] → 输出: true
输入: [0,0,1,2,5] → 输出: true (0 可以看作 3 和 4)
输入: [3,4,5,6,7] → 输出: true
输入: [1,2,3,4,9] → 输出: false
解法思路:排序 + 贪心判断
🔍 核心思想:
- 把数组排序;
- 统计 0 的个数(代表“大小王”);
- 从第一个非零的数开始遍历:
- 如果有重复的数(非0),直接返回 false;
- 计算当前数和前一个数之间的空缺,用 0 去补;
- 如果 0 的数量不够补空缺,返回 false;
- 否则返回 true。
实现代码
#include <algorithm>
#include <vector>using namespace std;class Solution {
public:bool isStraight( vector<int> nums){sort( nums.begin(), nums.end() );int zeroCount = 0;for ( int i = 0; i < 4; ++i ){if ( nums[ i ] == 0 ){zeroCount++;}else if ( nums[ i ] == nums[ i + 1 ] ){// 出现非0重复,不可能构成顺子return false;}}// 判断最大值和最小值的差是否小于等于4,或者用 0 填补中间空缺if ( nums[ 4 ] - nums[ zeroCount ] <= 4 )return true;elsereturn false;}
};int main()
{Solution s;vector<int> nums = { 1, 2, 3, 4, 5 };cout << std::boolalpha<< s.isStraight( nums ) << endl;nums = { 1, 2, 6, 4, 5 };cout << std::boolalpha<< s.isStraight( nums ) << endl;return 0;
}
运行结果
true
false