日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

程序员面试题精选100题(40)-扑克牌的顺子[算法]

發布時間:2025/3/21 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员面试题精选100题(40)-扑克牌的顺子[算法] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

?????????分析:這題目很有意思,是一個典型的寓教于樂的題目。

?????????我們需要把撲克牌的背景抽象成計算機語言。不難想象,我們可以把5張牌看成由5個數字組成的數組。大小王是特殊的數字,我們不妨把它們都當成0,這樣和其他撲克牌代表的數字就不重復了。

?????????接下來我們來分析怎樣判斷5個數字是不是連續的。最直觀的是,我們把數組排序。但值得注意的是,由于0可以當成任意數字,我們可以用0去補滿數組中的空缺。也就是排序之后的數組不是連續的,即相鄰的兩個數字相隔若干個數字,但如果我們有足夠的0可以補滿這兩個數字的空缺,這個數組實際上還是連續的。舉個例子,數組排序之后為{01345}。在13之間空缺了一個2,剛好我們有一個0,也就是我們可以它當成2去填補這個空缺。

?????????于是我們需要做三件事情:把數組排序,統計數組中0的個數,統計排序之后的數組相鄰數字之間的空缺總數。如果空缺的總數小于或者等于0的個數,那么這個數組就是連續的;反之則不連續。最后,我們還需要注意的是,如果數組中的非0數字重復出現,則該數組不是連續的。換成撲克牌的描述方式,就是如果一副牌里含有對子,則不可能是順子。

?????????基于這個思路,我們可以寫出如下的代碼:

// Determine whether numbers in an array are continuous // Parameters: numbers: an array, each number in the array is between // 0 and maxNumber. 0 can be treeted as any number between // 1 and maxNumber // maxNumber: the maximum number in the array numbers bool IsContinuous(std::vector<int> numbers, int maxNumber) {if(numbers.size() == 0 || maxNumber <=0)return false;// Sort the array numbers.std::sort(numbers.begin(), numbers.end());int numberOfZero = 0;int numberOfGap = 0;// how many 0s in the array?std::vector<int>::iterator smallerNumber = numbers.begin();while(smallerNumber != numbers.end() && *smallerNumber == 0){numberOfZero++;++smallerNumber;}// get the total gaps between all adjacent two numbersstd::vector<int>::iterator biggerNumber = smallerNumber + 1;while(biggerNumber < numbers.end()){// if any non-zero number appears more than once in the array,// the array can't be continuousif(*biggerNumber == *smallerNumber)return false;numberOfGap += *biggerNumber - *smallerNumber - 1;smallerNumber = biggerNumber;++biggerNumber;}return (numberOfGap > numberOfZero) ? false : true; }

?????????本文為了讓代碼顯得比較簡潔,上述代碼用C++的標準模板庫中的vector來表達數組,同時用函數sort排序。當然我們可以自己寫排序算法。為了有更好的通用性,上述代碼沒有限定數組的長度和允許出現的最大數字。要解答原題,我們只需要確保傳入的數組的長度是5,并且maxNumber13即可。

?

????本文已經收錄到《劍指Offer——名企面試官精講典型編程題》一書中,有改動,書中的分析講解更加詳細。歡迎關注。

??????? 本題已被九度Online Judge系統收錄,歡迎讀者移步到http://ac.jobdu.com/hhtproblems.php在線測試自己的代碼。

??? 博主何海濤對本博客文章享有版權。網絡轉載請注明出處http://zhedahht.blog.163.com/。整理出版物請和作者聯系。

總結

以上是生活随笔為你收集整理的程序员面试题精选100题(40)-扑克牌的顺子[算法]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。