劍指offer第二版 面試題60(java)

2021-09-24 07:31:16 字數 1915 閱讀 7102

面試題:n個骰子的點數

思路:n個骰子的點數和的最小值為n,最大值為6n,且n個骰子的所有點數的排列數為6^n——需要先統計出每個點數出現的次數,然後把每個點數出現的次數除以6^n,即每個點數出現的概率

可用兩種方法:遞迴和迴圈

遞迴的思路:

想求出n個骰子的點數和,可以先把n個骰子分為兩堆:第一堆只有乙個;另一堆有n-1個。單獨的那堆有6種可能出現的點數,我們需要計算1~6的每一種點數和剩下的n-1個骰子來計算點數和

把n-1個骰子仍然分為兩堆……

這是個遞迴的思路,遞迴結束的條件是最後只剩下乙個骰子

定義乙個6n-n+1的陣列,將和為s的點數出現的次數儲存到陣列的第s-n個元素中

(相當於n個for迴圈,在最後一層for迴圈的時候把當前的n個固定值加起來,在problist的對應位置+1)

但是基於遞迴的實現有很多計算是重複的,因此當number變大時,效能也會很慢

迴圈的思路:

用兩個陣列來儲存骰子點數的每個總數出現的次數

在一輪迴圈中,第乙個陣列中的第n個數字表示骰子和為n出現的次數

在下一輪迴圈中,加上乙個新的骰子——此時和為n的骰子出現的次數,等於上一輪迴圈中骰子點數和為n-1、n-2、、n-3、n-4、n-5、n-6的次數的總和,因此,將另乙個陣列的第n個數字設為前乙個陣列對應的第n-1、n-2、、n-3、n-4、n-5、n-6個數字之和

(如在上一輪和為20的次數為x,在新的一輪中,加入了乙個新的骰子,新的骰子的取值可能為1~6且都只有1次,因此在計算和為20的次數時,需要計算當新骰子為1時,之前為20-1的次數+新骰子為2時,之前為20-2的次數+……+新骰子為6,之前為20-6的次數,即第n-1、n-2、、n-3、n-4、n-5、n-6個數字之和)

**:

// 遞迴

public class q60_1

public static void printsum(int n)

// 初始化陣列

int maxsum = maxv * n;

int problist = new int[maxsum-n+1];

// 遞迴計算骰子點數

probability(n,problist);

// 計算基數

int total = (int)math.pow(maxv, n);

// 列印比例

for(int i=n;i// 分成兩堆,迴圈是指當分為單獨乙個的骰子分別取1~6時,另外的一堆的各種取值

public static void probability(int n,int problist) }

// sum為當前面的固定的和

public static void probability(int orig, int curr, int sum, int problist) else

} }}

// 迴圈

public class q60_2

public static void printsum(int n)

int prob = new int[2][maxv*n+1];

int flag = 0;

// 第一輪的初始化

for(int i=1;i<=maxv;i++)

// k是加入了幾顆骰子

for(int k=2;k<=n;k++)

// i是當前更新的位置

for(int i=k;i<=maxv*k;i++) }}

flag = 1-flag;

} double sum=0;

int total = (int)math.pow(maxv, n);

for(int i=n;isystem.out.println(sum);

}}

劍指offer第二版 面試題6(java)

面試題6 從尾到頭列印鍊錶 題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值 鍊錶的結點定義如下 public class listnode 注意 面試中,如果打算修改輸入的資料,最好先問好是否資料是允許修改的 思路 1.遍歷順序從頭到尾,列印順序從尾到頭,第乙個結點最開始被訪問,但是最...

劍指offer第二版 面試題8 java

題目描述 給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標 分析 情況 一 有右子樹,這時只需要把其右孩子作為下乙個遍歷的 並不是要找的 節點,然後沿著該節點的左子樹 如果有的話 出發,直到遇到葉子節點,那麼該葉子節...

劍指offer第二版 面試題9(java)

面試題9 用兩個棧實現佇列 題目描述 方法 兩個棧 stack1 stack2 插入時,直接放入stack1 刪除時,直接彈出pop2中的物件 如果pop2為空,則先將pop1中的物件放入stack2中,再從stack2裡pop第乙個 如 依次放入stack1中1 2 3,在彈出並放入stack2中...