码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] 357. Count Numbers with Unique Digits

时间:2018-09-25 01:31:19      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:情况   number   数字   延伸   等于   找规律   The   ret   nbsp   

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;
    }

 

[LeetCode] 357. Count Numbers with Unique Digits

标签:情况   number   数字   延伸   等于   找规律   The   ret   nbsp   

原文地址:https://www.cnblogs.com/Moriarty-cx/p/9697293.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!