題目:從撲克牌中隨機抽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
