**
題目:從撲克牌中隨機抽5張牌,判斷是不是乙個順子,即這5張牌是不是連續的。2-10為數字本身,a為1,j為11,q為12,k為13,而大小王可以看成任意數字。
分析:這題目很有意思,是乙個典型的寓教於樂的題目。
我們需要把撲克牌的背景抽象成計算機語言。不難想象,我們可以把5張牌看成由5個數字組成的陣列。大小王是特殊的數字,我們不妨把它們都當成0,這樣和其他撲克牌代表的數字就不重複了。
接下來我們來分析怎樣判斷5個數字是不是連續的。最直觀的是,我們把陣列排序。但值得注意的是,由於0可以當成任意數字,我們可以用0去補滿陣列中的空缺。也就是排序之後的陣列不是連續的,即相鄰的兩個數字相隔若干個數字,但如果我們有足夠的0可以補滿這兩個數字的空缺,這個陣列實際上還是連續的。舉個例子,陣列排序之後為。在1和3之間空缺了乙個2,剛好我們有乙個0,也就是我們可以它當成2去填補這個空缺。
於是我們需要做三件事情:把陣列排序,統計陣列中0的個數,統計排序之後的陣列相鄰數字之間的空缺總數。如果空缺的總數小於或者等於0的個數,那麼這個陣列就是連續的;反之則不連續。最後,我們還需要注意的是,如果陣列中的非0數字重複出現,則該陣列不是連續的。換成撲克牌的描述方式,就是如果一副牌裡含有對子,則不可能是順子。
#include#includeusing namespace std;
//determine whether numbers in an array are continuous
bool iscontinuous(vectornumbers, int maxnumber)
//get the total gaps between all adjacent two numbers
vector::iterator biggernumber = smallernumber + 1;
while(biggernumber != numbers.end())
// if there are too many gaps to fill with jokers, they are not continuous
return (numberofgap > numberofjoker)? false : true;
}int main()
; vectornumbers(array, array+5);
size_t maxnumber = 13;
if(iscontinuous(numbers, maxnumber))
cout<<"true, they are continuous!"<
面試題61 撲克牌順子
題目描述 ll今天心情特別好,因為他去買了一副撲克牌,發現裡面居然有2個大王,2個小王 一副牌原本是54張 他隨機從中抽出了5張牌,想測測自己的手氣,看看能不能抽到順子,如果抽到的話,他決定去買體育彩票,嘿嘿!紅心a,黑桃3,小王,大王,方片5 oh my god 不是順子 ll不高興了,他想了想,...
面試題44 撲克牌的順子
題目 從撲克牌中隨機抽5張牌,判斷是不是乙個順子,即這5張牌是不是連續的。2 10為數字本身,a為1,j為11,q為12,k為13,而大 小王可以看成任意數字。思路 可以把5張牌看做乙個陣列,大小王設為0。然後對陣列進行排序,看陣列的數字是不是連續的,因為0可以看做任意數字,所以如果相鄰兩個數字之間...
面試題48 撲克牌的順子
題目 從撲克牌中隨機抽5張牌,判斷是不是乙個順子,即這5張牌是不是連續的。2到10是數字本身,a為1,j為11,q為12,k為13,而大小王可以看成任意數字。思路 除了大小王以外,其他的牌都可以用數字代替,因此我們用0來代替大小王。可以先將數字排序,如果所有數字都是連續的,則是順子。如果不是連續的,...