天天看點

頭腦風暴:統計各位數字都不同的數字個數

題目

給你一個整數 n ,統計并傳回各位數字都不同的數字 x 的個數,其中 0 <= x < 10^n。

提示:0 <= n <= 8

示例1:

輸入:n = 2      

示例2:

輸入:n = 0      

解題思路

當 n=0,數字有{0} 1個。

當 n=1,數字有 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 10個。

從 n=1 的數字清單 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 中随便取出一個除0以外的數字,因為0不能作為起始數字!,,我們取2好了。通過在2的尾巴處拼接一位數字可以得到新的合法數字有:

{20, 21,23,24,25,26,27,28,29},

可以看到,除了不能在尾巴處拼接一個2,兩個連續的2就不滿足要求了,0-9種一共有9個數字可以拿來拼接在尾巴處。新增答案為9個。同理,對于n=1數字清單{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}中的其他任意非0數也可以進行拼接操作,一共可以新增9*9個答案。

最終,n=2的合法數字,n=1時的答案 + 長度為2的數字個數(9*9個)= 10 + 81 = 91。

n=3時同理,隻不過此時可以用拼接的數字減少為了8個,此時答案為10 + 9 * 9 + 9 * 9 * 8 = 739。

代碼實作

class Solution {
    public int countNumbersWithUniqueDigits(int {
        if(n == 0)
        {
            return 1;
        }

        int[] dp = new int[n+1];
        dp[0] = 1;
        dp[1] = 10;
        for(int i = 2; i <= n; i++)
        {
            dp[i] = dp[i-1] + (dp[i-1] - dp[i-2])*(10-(i-1));
        }
        return      

繼續閱讀