leetcode 357は、異なるそれぞれの数の桁数を算出します

デジタルは違うのですか?配置の組み合わせにアレンジ!

問題の意味は以下の通り:
負でない整数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;
    }
};
公開された34元の記事 ウォンの賞賛0 ビュー590

おすすめ

転載: blog.csdn.net/Luyoom/article/details/103689677