[LeetCode] 357. Count Numbers with Unique Digits

Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n.

Example:

Input: 2
Output: 91 
Explanation: The answer should be the total numbers in the range of 0 ≤ x < 100, 
             excluding 11,22,33,44,55,66,77,88,99

题意:从0至10的n次方中 没有重复数字的数 的个数
比方说:100以内重复的有11,22,33。。。99,也就是说100 - 9 等于91;
这100个数字是有0,没有100的;
正向思维,找规律,计算所有重复的,然后减去这个值,
比方说:100 - 9 = 91;
如果是 n为3的话,100以内已经确定了9个,100 - 200 内(不包括200),有18个,不考虑首位,00,11,22,33,,,99,有10个,考虑首位,11x有10个,1x1有10个去两次(3位数-1)111,
依次可以找规律,有兴趣的同学可以自己解一下
这里我没有解,因为列边界条件时,我想到了一些其他东西分享给大家
n为非负整数,n为0 是返回1 n为1时返回10,
0-9只有10个数字,也就是说n>=10时返回的结果是一样的,其二这里的n是指10的n次方
那么可以延伸出另一层意思,是个n位数以内的解法,求不重合数字的个数
那么,我们直接拿概率论解
2位数 9*9 + 9 + 1; 首位不可能为0,那么满位情况的数量就是9*9,少位情况下就是9,+1特指0;
3位数 9*9*8 + 9*9 + 9 +1 同理上面,首位不可能为0,满位情况就是9*9*8,少一位9*9,接着9,最后+1,漏掉的0;
那么解法就比较明显了
public int countNumbersWithUniqueDigits(int n) {
        if (n == 0)
            return 1;
        if (n == 1)
            return 10;
        if (n >= 10)
            n = 10;
        int sum = 0;
        int num = 1;
        for (int i = 0; i < n; i++) {
            num = 9;
            int k = i + 1;
            for (int j = 9; j > 0 && k < n; j--, k++) {
                num *= j;
            }
            sum += num;
        }
        return sum + 1;
    }
原文地址:https://www.cnblogs.com/Moriarty-cx/p/9697293.html