撲克牌的順子問題(Python)


題目:從撲克牌中隨機抽5張牌,判斷是不是一個順子,即這5張牌是不是連續的。2-10為數字本身,A為1,J為11,Q為12,K為13,而大小王可以看成任意數字。

 

第一種方法是以大小王做0,計算空缺位置,若不大於0的個數則為匹配。該方法需要首先將牌進行排序。

 1 def is_continuous(numbers):
 2     """ 判斷抽取的5張牌是否是順子。
 3 
 4     Args:
 5         numbers: 抽取的5張牌。
 6 
 7     Returns:
 8         布爾變量,表示是否是順子。
 9     """
10     if len(numbers) < 1:
11         return False
12     numbers.sort()
13 
14     num_of_zero = numbers.count(0) # 統計數組中0的個數
15     num_of_gap = 0
16 
17     # 統計數組中的間隔數目
18     small = num_of_zero
19     big = small + 1
20     while big < len(numbers):
21         if numbers[small] == numbers[big]: # 有重復元素,不可能是順子
22             return False
23         num_of_gap += numbers[big] - numbers[small] - 1
24         small += 1
25         big += 1
26     return False if num_of_gap > num_of_zero else True

 

第二種方法簡單粗暴,直接用hash表來做,避免了排序。Python中可以使用dict,其它語言可以建立長度為13的數組做hash。

得到hash表后只需計算最大的鍵值和最小的鍵值的差,若小於4,不需考慮有多少大小王,都可以組成順子。

 1 def is_continuous_hash(numbers):
 2     """ 判斷抽取的5張牌是否是順子。使用hash方法。
 3 
 4     Args:
 5         numbers: 抽取的5張牌。
 6 
 7     Returns:
 8         布爾變量,表示是否是順子。
 9     """
10     if len(numbers) < 1:
11         return False
12     cards = {}
13     for num in numbers:
14         if num == 0:
15             continue
16         if num in cards.keys():
17             return False
18         else:
19             cards[num] = 1
20     return True if max(cards.keys()) - min(cards.keys()) <= 4 else False

 

程序代碼見:https://github.com/meantobe/blog/blob/master/algorithm/continous_cards.py

 

參考資料:

1. http://zhedahht.blog.163.com/blog/static/25411174200951262930831


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM