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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

程序员面试题精选100题(43)-n个骰子的点数[算法]

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

題目:把n個骰子扔在地上,所有骰子朝上一面的點數之和為S。輸入n,打印出S的所有可能的值出現的概率。

分析:玩過麻將的都知道,骰子一共6個面,每個面上都有一個點數,對應的數字是1?6之間的一個數字。所以,n個骰子的點數和的最小值為n,最大值為6n。因此,一個直觀的思路就是定義一個長度為6n-n的數組,和為S的點數出現的次數保存到數組第S-n個元素里。另外,我們還知道n個骰子的所有點數的排列數6^n。一旦我們統計出每一點數出現的次數之后,因此只要把每一點數出現的次數除以n^6,就得到了對應的概率。

該思路的關鍵就是統計每一點數出現的次數。要求出n個骰子的點數和,我們可以先把n個骰子分為兩堆:第一堆只有一個,另一個有n-1個。單獨的那一個有可能出現從16的點數。我們需要計算從16的每一種點數和剩下的n-1個骰子來計算點數和。接下來把剩下的n-1個骰子還是分成兩堆,第一堆只有一個,第二堆有n-2個。我們把上一輪那個單獨骰子的點數和這一輪單獨骰子的點數相加,再和剩下的n-2個骰子來計算點數和。分析到這里,我們不難發現,這是一種遞歸的思路。遞歸結束的條件就是最后只剩下一個骰子了。

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

int g_maxValue = 6;void PrintSumProbabilityOfDices_1(int number) {if(number < 1)return;int maxSum = number * g_maxValue;int* pProbabilities = new int[maxSum - number + 1];for(int i = number; i <= maxSum; ++i)pProbabilities[i - number] = 0;SumProbabilityOfDices(number, pProbabilities);int total = pow((float)g_maxValue, number);for(int i = number; i <= maxSum; ++i){float ratio = (float)pProbabilities[i - number] / total;printf("%d: %f\n", i, ratio);}delete[] pProbabilities; }void SumProbabilityOfDices(int number, int* pProbabilities) {for(int i = 1; i <= g_maxValue; ++i)SumProbabilityOfDices(number, number, i, 0, pProbabilities); }void SumProbabilityOfDices(int original, int current, int value, int tempSum, int* pProbabilities) {if(current == 1){int sum = value + tempSum;pProbabilities[sum - original]++;}else{for(int i = 1; i <= g_maxValue; ++i){int sum = value + tempSum;SumProbabilityOfDices(original, current - 1, i, sum, pProbabilities);}} }

上述算法當number比較小的時候表現很優異。但由于該算法基于遞歸,它有很多計算是重復的,從而導致當number變大時性能讓人不能接受。關于遞歸算法的性能討論,詳見本博客系列的第16題。

我們可以考慮換一種思路來解決這個問題。我們可以考慮用兩個數組來存儲骰子點數每一總數出現的次數。在一次循環中,第一個數組中的第n個數字表示骰子和為n出現的次數。那么在下一循環中,我們加上一個新的骰子。那么此時和為n的骰子出現的次數,應該等于上一次循環中骰子點數和為n-1n-2n-3n-4n-5n-6的總和。所以我們把另一個數組的第n個數字設為前一個數組對應的第n-1n-2n-3n-4n-5n-6之和。基于這個思路,我們可以寫出如下代碼:


void PrintSumProbabilityOfDices_2(int number) {double* pProbabilities[2];pProbabilities[0] = new double[g_maxValue * number + 1];pProbabilities[1] = new double[g_maxValue * number + 1];for(int i = 0; i < g_maxValue * number + 1; ++i){pProbabilities[0][i] = 0;pProbabilities[1][i] = 0;}int flag = 0;for (int i = 1; i <= g_maxValue; ++i)pProbabilities[flag][i] = 1;for (int k = 2; k <= number; ++k){for (int i = k; i <= g_maxValue * k; ++i){pProbabilities[1 - flag][i] = 0;for(int j = 1; j <= i && j <= g_maxValue; ++j)pProbabilities[1 - flag][i] += pProbabilities[flag][i - j];}flag = 1 - flag;}double total = pow((double)g_maxValue, number);for(int i = number; i <= g_maxValue * number; ++i){double ratio = pProbabilities[flag][i] / total;printf("%d: %f\n", i, ratio);}delete[] pProbabilities[0];delete[] pProbabilities[1]; }

??? 值得提出來的是,上述代碼沒有在函數里把一個骰子的最大點數硬編碼(hard code)6,而是用一個變量g_maxValue來表示。這樣做的好處時,如果某個廠家生產了最大點數為4或者8的骰子,我們只需要在代碼中修改一個地方,擴展起來很方便。如果在面試的時候我們能對面試官提起對程序擴展性的考慮,一定能給面試官留下一個很好的印象。

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

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

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

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

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

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

主站蜘蛛池模板: 久久网免费视频 | 伊人久久免费视频 | 精品人妻中文无码av在线 | 日韩av在线影院 | av四虎| 快播91| 又黄又爽无遮挡 | 久久99精品国产麻豆婷婷 | 91免费成人 | 亚洲电影影音先锋 | 国产精品夜夜夜爽张柏芝 | 婷婷另类小说 | 艳妇av | 国产精品成人自拍 | 男人天堂色 | 天天操天天添 | 精品免费国产一区二区三区 | 欧美国产精品一二三 | 男女羞羞动态图 | 天天做天天爱天天爽综合网 | 国产欧美一区二区精品忘忧草 | 黄a在线观看 | 色就是色欧美色图 | av在线影音 | 日本久久高清视频 | 久久福利国产 | 一区二区不卡在线 | 欧美性生交片4 | 日本道在线观看 | 国产精品一区二区免费在线观看 | 色花av | 国产美女免费视频 | 高清欧美精品xxxxx在线看 | 成人一卡二卡 | 亚洲免费在线观看av | 香蕉久久网站 | 欧美女同在线 | 亚洲视频国产视频 | 日本网站免费观看 | 国产网址 | 国产伊人一区 | 四季av一区二区夜夜嗨 | 两个人看的www视频免费完整版 | 都市豪门艳霸淫美妇 | 亚洲一区二区三区影院 | 久久久久一区二区三区 | 成 人免费va视频 | 日本免费在线一区 | 久久aⅴ国产欧美74aaa | 欧美午夜精品理论片 | 奇米四色在线观看 | 日本乱偷人妻中文字幕在线 | 午夜精品久久久久久久99热黄桃 | 青青草在线播放 | 黄色wwwww | 老女人毛片 | 中文字幕成人 | 好大好舒服视频 | 色眯眯影视| 国产三级av在线 | 国产大奶| 国产精品久久久久久久妇 | 国产精品中文字幕在线观看 | 夜夜嗨老熟女av一区二区三区 | 亚洲成人aa| 色综合久久av | 免费看美女被靠到爽的视频 | 中文字幕乱码在线人视频 | 国产三级漂亮女教师 | 五十路在线视频 | 伊人7| 亚洲国产精品一 | 久久日韩精品 | 欧美久久99 | 亚洲精美视频 | 国产免费看片 | 国产又粗又猛又爽又黄的视频在线观看动漫 | 好邻居韩国剧在线观看 | wwww在线观看 | 亚洲av中文无码乱人伦在线观看 | 国产欧美日韩精品区一区二污污污 | 国产 日韩 一区 | 99re这里只有精品在线 | 日韩欧美精品 | 国产成人亚洲精品 | 日本在线高清视频 | chien国产乱露脸对白 | 四虎影音先锋 | 色婷婷国产精品久久包臀 | 日韩av在线第一页 | 亚洲高潮 | 人乳videos巨大吃奶 | 国产精品日韩一区二区三区 | 你懂的国产 | 懂色aⅴ国产一区二区三区 亚洲欧美国产另类 | 日韩av在线直播 | 久久手机免费视频 | 国产在线不卡一区 | 中文人妻av久久人妻18 |