デジタルは違うのですか?配置の組み合わせにアレンジ!
問題の意味は以下の通り:
負でない整数nは、計算の桁数を考えるとは異なる数である場合には0≤X <10 ^ N、xは。
例:
入力:2
出力:91
説明:11,22,33,44,55,66,77,88,99答えは削除する必要があり、[0100)期間中のすべての数字。
分析のトピック
最初の栗の場合
- N = 1
すなわち、X∈[0、10)
X = 0 1 5 4 3 2 6 7 8 9(10選択の合計)
(同じ数の数は問題ではない確かに見えます) - N = 2
すなわち、xは∈[0、100)
Xであります二桁_ _
場合は最初のビットは 1 ====取る秒を取ることができます2 3 4 5 6 7 8 9 0(選択された9の合計)
第取ることができます1 2 3 4 5 6 7 8 9(0を選択し9の合計を取ることができない注)
数= 9×9 =81
---- 合計10 + 81 = 91 - N = 3
、すなわち、xは∈[0、1000)
Xであります3桁の数字_ _
場合は最初のビットは 1 ====取る秒を取ることができます2 3 4 5 6 7 8 9 0(9の合計は、選択された)
、あれば第テイク2 ==== 第が取ることができます3 4 5 6 7 8 9 0(8個の選択の合計)は、
最初取ることができます1 2 3 4 5 6 7 8 9(0を選択し9の合計を取ることができない注)
数= 8×9×9 =648
---- 合計10 + 81 + 648 = 739
...
ので、
最終的には、xのビット数10以上時間は確かだろうデジタル複写
だから、長い間の議論として、状況の10種類の
主要な怠惰な...そう...暴力大法が良いので!(#^。^#)
コードは以下の通りであります:
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
if(n==0) return 1;
if (n == 1) return 10;
else if (n == 2) return 91;
else if (n == 3) return 9*9*8 + 91;
else if (n == 4) return 9*9*8*7 + 9*9*8 + 91;
else if (n == 5) return 9*9*8*7*6 + 9*9*8*7 + 9*9*8 + 91;
else if (n == 6) return 9*9*8*7*6*5 + 9*9*8*7*6 + 9*9*8*7 + 9*9*8 + 91;
else if (n == 7) return 9*9*8*7*6*5*4 + 9*9*8*7*6*5 + 9*9*8*7*6 + 9*9*8*7 + 9*9*8 + 91;
else if (n == 8) return 9*9*8*7*6*5*4*3 + 9*9*8*7*6*5*4 + 9*9*8*7*6*5 + 9*9*8*7*6 + 9*9*8*7 + 9*9*8 + 91;
else if (n == 8) return 9*9*8*7*6*5*4*3*2 + 9*9*8*7*6*5*4*3 + 9*9*8*7*6*5*4 + 9*9*8*7*6*5 + 9*9*8*7*6 + 9*9*8*7 + 9*9*8 + 91;
else return 9*9*8*7*6*5*4*3*2*1 + 9*9*8*7*6*5*4*3*2 + 9*9*8*7*6*5*4*3 + 9*9*8*7*6*5*4 + 9*9*8*7*6*5 + 9*9*8*7*6 + 9*9*8*7 + 9*9*8 + 91;
}
};