[LeetCode] 357. Count Numbers with Unique Digits
Posted C·Moriarty
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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, excluding11,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的主要内容,如果未能解决你的问题,请参考以下文章
[LeetCode] 357. Count Numbers with Unique Digits
leetCode 357. Count Numbers with Unique Digits | Dynamic Programming | Medium
357 Count Numbers with Unique Digits 计算各个位数不同的数字个数
LeetCode: missing num, count of 1s