题目地址:https://leetcode.com/problems/count-numbers-with-unique-digits/description/
Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10^n.
Example:
Given n = 2, return 91. (The answer should be the total numbers in the range of 0 ≤ x < 100, excluding [11,22,33,44,55,66,77,88,99])
这种题目可以用组合的思想:
可以这么想,假如 f(n) 表示各位数字不同的数字的个数,那么当一个数字有 n 位的时候,有以下两种情况:
- 如果最高位是
0 ,那么低 n−1 位各位数字不同的数字的个数正好是 f(n−1) 。- 如果最高位不为
0
,那么最高位有
C19 种可能性,因为只能从1到9中选择,第二位有 C19 种可能性,这是因为第二位在选完第一位剩下的数字的基础上又添加了 0 ,很显然第三位有C18 种可能性,那么当 n≥2 第n位有 C111−n 种可能性。 所以:
f(n)=f(n−1)+C19C19C18…C111−n编码如下:
public class CountNumbersWithUniqueDigits { public static int countNumbersWithUniqueDigits(int n) { if (n == 0) return 1; if (n == 1) return 10; return countNumbersWithUniqueDigits(n - 1) + CNT(n); } public static int CNT(int n) { int res = 9; for (int i = 1; i < n ; i++) { res *= (10 - i); } return res; } public static void main(String[] args) { for (int i = 1; i <= 15; i++) { System.out.println(i + "*********" + countNumbersWithUniqueDigits(i)); } } }
- 如果最高位不为
0
,那么最高位有