思想:找規律,每位上的數有10種選擇[0,9],而如何要求每位上的數字不同則必須保證n最大為10,因為只要n>10也就是11位所表示的數各位上的數一定有重複。
f(0)=1
f(1)=10
f(2)=9*9+f(1)
而對於n(n<=10)位數,能組成的各位數字都不同的數字的個數f(n) = 9(第一位也就是最高位不能為0所以只有9種選擇)98…+f(n-1)因為前面的排列組合只考慮了n位數的情況,題目還要考慮位數從0->n-1位時的情況所以要麼遞迴(要大量重複計算),要麼採用dp來儲存之前的計算結果dp[i]表示i位數能構成的每位上的數字不同的數字個數,所以狀態轉移方程為:
dp[i] = dp[i-1] + curmount(位數為n時能構成的各位上數字不同的數的個數)
dp[i]表示從0位數到i位數能構成的各位不同的數字個數,這裡規定0位數只有1個數0
class solution
dp[i] = dp[i-1]+curmount;
}return dp[n];
}}
357 計算各個位數不同的數字個數
給定乙個非負整數 n,計算各位數字都不同的數字 x 的個數,其中 0 x 10n 示例 輸入 2 輸出 91 解釋 答案應為除去 11,22,33,44,55,66,77,88,99 外,在 0,100 區間內的所有數字。import j a.util.scanner class solution ...
計算各個位數不同的數字個數
題目 給定乙個非負整數 n,計算各位數字都不同的數字 x 的個數,其中 0 x 10 n 1.首先想到的是暴力版本 從0開始遍歷到 10 n,判斷每個數字的每一位是否被重複,沒有則計數 1 顯然這種方法遇到大量資料時,會超時。時間複雜度 o 10 n param n return var count...
101 計算各個位數不同的數字個數
題目描述 給定乙個非負整數 n,計算各位數字都不同的數字 x 的個數,其中 0 x 10n 示例 輸入 2 輸出 91 解釋 答案應為除去 11,22,33,44,55,66,77,88,99 外,在 0,100 區間內的所有數字。思路 一開始傻乎乎的打算使用遞迴來計算每個位數的個數,當然肯定超時啦...