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