牛牛愛66

今天面試了一道算法題,這到算法題我寫的有問題,我在這裏記錄一下。

衆所周知,牛牛不喜歡6這個數字(因爲牛牛和66發音相近)所以他想知道,不超過n位十進制數中有多少個數字不含有連續的6(從1開始算的)

輸入只包含一個正整數n(1<=n<20),輸出一個整數,表示不超過n位十進制數中有多少個數字不含有連續的6。

比如輸入1,輸出10: 1,2,3,4,5,6,7,8,9,10 這十個數字中都滿足條件

輸入2,輸出99,因爲只有66不滿足條件。

 

分析:

我是用動態規劃的方式來寫的,首先對於n位數,如果能求出來有多少個數字含有連續6,那麼用10^(n) - 這個數字 就可以。

我最開始的思路是有點問題的,在這裏記錄一下:

假設dp[n]表示的是n位數字的包含連續6的數字總數。那麼對於n+1位數來說,相當於在n位數前面加了一位數。假設從xxx變成了axxx(a是新加的最高位數)。我們考慮兩種情況,第一種,a!=6的情況:那麼當a不是6的時候,相當於這a可以取12345789(6不能取,0也不能取,因爲是n+1位數),在這些情況中,原本n位數中有多少連續6的數字,新增了一個不是6的高位數,肯定是不影響結果的,所以首先有dp[n + 1] 首先肯定包括 8*dp[n]。 然後考慮 a = 6的情況:當a= 6時候,考慮次高位也就是第n位數:當次高位是6的時候,那麼之後的低位數字無論怎麼變,都滿足連續6的數字,因爲最高位和次高位都是6. 所以還包括了10 ^(n - 1); 當次高位不是6的時候,那麼就需要看n-1位數中連續6的數字的個數了(也就是比如說60xx)這種情況中xx所有可能情況中6的個數,而這種情況下的個數應該是9*dp[n - 1]. 所以總的遞推關係是 dp[n + 1] = 8 * dp[n] + 9 * dp[n - 1] + 10^(n - 1).

結果最後的結果並不符合面試官的要求,遞推公式有問題。面試之後我也一直在想到底是哪裏出了問題,現在纔想明白。實際上我們要求的是n位數中包括的連續6的數字,而n位數包括了n-1位數,n-2位數等等。什麼意思呢,就是說比如60066這個數字是5位數中符合條件的,那麼66也算是5位數中符合條件的。具體在遞推公式中,也就是當高位不是6的情況下,不僅僅是12345789,而且0也行,當n+1位數爲0的時候,這說明是爲了添加某一個位數小於n+1的滿足條件的數字了。所以實際上遞推公式應該是:dp[n + 1] = 9 * dp[n] + 9 * dp[n - 1] + 10^(n - 1). 遞歸起始條件是dp[1] = 0, dp[2] = 1. 

因爲一道題而掛掉了面試,權當在此記錄一下自己辛酸的歷程吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章