1、題目描述
從若干副撲克牌中隨機抽 5 張牌,判斷是不是一個順子,即這5張牌是不是連續的。2~10為數字本身,A為1,J為11,Q為12,K為13,而大、小王為 0 ,可以看成任意數字。A 不能視為 14。
示例 1:
輸入: [1,2,3,4,5]
輸出: True
示例 2:
輸入: [0,0,1,2,5]
輸出: True
2、VS2019上運行
排序的方法
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;class Solution {
public:/*** 判斷給定的撲克牌數組是否是一個順子* @param nums 給定的撲克牌數組* @return 如果是順子,返回true;否則,返回false*/bool isStraight(vector<int>& nums) {sort(nums.begin(), nums.end()); // 對撲克牌數組進行排序int zero = 0; // 記錄0的數量(大小王的數量)for (int i = 0; i < 4; i++) {if (nums[i] == 0) {zero++; // 統計0的數量continue;}if (nums[i] == nums[i + 1]) {return false; // 存在對子,不是順子,返回false}zero -= nums[i + 1] - nums[i] - 1; // 計算間隔并減去大小王的數量}return zero >= 0; // 如果剩余的大小王數量可以填補所有間隔,返回true;否則,返回false}
};int main() {vector<int> nums = { 1, 2, 3, 4, 5 };Solution solution;bool result = solution.isStraight(nums);cout << (result ? "true" : "false") << endl;return 0;
}
運行結果:
true
3、解題思路
- 1.首先對給定的撲克牌數組進行排序,使其按照牌面大小升序排列。
- 2.統計大小王的數量,即統計數組中0的個數。
- 3.遍歷排序后的數組,從第一個非0的數字開始(nums[i] != 0),判斷后續數字是否連續。具體步驟如下:
~如果遇到相同的數字,說明存在對子,不滿足順子的要求,直接返回false。
~計算相鄰數字之間的間隔(排除了0),如果間隔大于1,則需要使用大小王來填補空缺。將大小王的數量減去該間隔值減1。如果大小王數量不足以填補空缺,說明不是順子,返回false。 - 4.如果遍歷完所有數字都滿足連續關系,且大小王的剩余數量足夠填補空缺,則返回true。
4、題目理解
- 從一副撲克牌中隨機抽取5張牌,要判斷這5張牌是否是一個順子,即這些牌是否是連續的。
- 給定的撲克牌規則如下:
1.數字2~10對應牌面上的數字本身。
2.A表示1。
3.J表示11。
4.Q表示12。
5.K表示13。
6.大、小王可看作任意數字,大、小王分別用0表示。 - 要判斷這5張牌是否是一個順子,可以按照以下步驟:
- 1.對這5張牌進行排序,確保它們按照牌面的大小排列。
2.統計大、小王(即0)的數量。
3.在排序后的牌中,找到第一個非0的數字,記作x。
4.從x+1開始,判斷后面的數字是否依次遞增,即是否連續。如果存在非連續的數字(除了0之外),則不是順子。
5.最后,考慮大、小王的數量。如果大、小王的數量多于等于缺失的數字數量(非0的間隔數量),則可以使用大、小王來填補間隔,使得牌依舊連續。否則,無法湊成一個順子。