題目來源:
http://zhedahht.blog.163.com/blog/static/25411174200951262930831/ 題目:從撲克牌中隨機抽5張牌,判斷是不是一個順子,即這5張牌是不是連續的。2-10為數字本身,A為1,J為11,Q為12,K為13,而大小王可以看成任意數字。思路一:
我們需要把撲克牌的背景抽象成計算機語言。不難想象,我們可以把5
張牌看成由5
個數字組成的數組。大小王是特殊的數字,我們不妨把它們都當成0
,這樣和其他撲克牌代表的數字就不重復了。
接下來我們來分析怎樣判斷5個數字是不是連續的。最直觀的是,我們把數組排序。但值得注意的是,由于0可以當成任意數字,我們可以用0去補滿數組中的空缺。也就是排序之后的數組不是連續的,即相鄰的兩個數字相隔若干個數字,但如果我們有足夠的0可以補滿這兩個數字的空缺,這個數組實際上還是連續的。舉個例子,數組排序之后為{0,1,3,4,5}。在1和3之間空缺了一個2,剛好我們有一個0,也就是我們可以它當成2去填補這個空缺。
于是我們需要做三件事情:把數組排序,統計數組中0的個數,統計排序之后的數組相鄰數字之間的空缺總數。如果空缺的總數小于或者等于0的個數,那么這個數組就是連續的;反之則不連續。最后,我們還需要注意的是,如果數組中的非0數字重復出現,則該數組不是連續的。換成撲克牌的描述方式,就是如果一副牌里含有對子,則不可能是順子。
更好的思路二:
1)確認5張牌中除了0,其余數字沒有重復的(可以用表統計的方法);
2) 滿足這樣的邏輯:(max,min分別代表5張牌中的除0以外的最大值最小值)
如果沒有0,則max-min=4,則為順子,否則不是
如果有一個0,則max-min=4或者3,則為順子,否則不是
如果有兩個0,則max-min=4或者3或者2,則為順子,否則不是
最大值和最小值在1)中就可以獲得,這樣就不用排序了