题意分析:给定非负的整数n,求在0<=x<10^n中,有多少每个位上的数字互不相同的数?如n=2时,范围为[0,100],共有91个数(除了11,22,33,44,55,66,77,88,99)。
解题思路:
统计规律如下:
i = 1时,10个 i = 2时,10个 + 9*9个 i = 3时,10个 + 9*9个 + 9*9*8个 i = 4时,10个 + 9*9个 + 9*9*8个 + 9*9*8*7个 ...... i = n时,10个 + 9*9个 + 9*9*8个 + 9*9*8*7个 + ... + 9*9*8*7*...*(9-i+2)
根据以上分析,便可编写程序实现。
C++实现
// 直接求解实现 int countNumbersWithUniqueDigits1(int n) { if (n == 0) return 1; int result = 10; if (n == 1) return result; int temp = 9; for (int i = 2; i <= n; i++) { temp = temp * (9 - i + 2); result += temp; } return result; } // 利用额外数据进行实现(类似动态规划思想) int countNumbersWithUniqueDigits(int n) { n = min(n, 10); int *p = new int[n+1]; for (int i = 0; i <= n; i++) { p[i] = 9; } p[0] = 1; for (int i = 2; i <= n; i++) { for (int x = 9; x >= 9 - i + 2; x--) { p[i] *= x; } } int result = 0; for (int i = 0; i <= n; i++) result += p[i]; return result; }
Java实现
// 直接实现 public int countNumbersWithUniqueDigits(int n) { if (n == 0) return 1; if (n == 1) return 10; int result = 10; int temp = 9; for (int i = 2; i <= n; i++) { temp *= (9 - i + 2); result += temp; } return result; } // 利用额外数据进行实现(类似动态规划思想) public int countNumbersWithUniqueDigits(int n) { if (n == 0) return 1; if (n == 1) return 10; int [] p = new int[n + 1]; for (int i = 0; i <= n; i++) p[i] = 9; int result = 0; p[0] = 1; for (int i = 2; i <= n; i++) { for (int x = 9; x >= 9 - i + 2; x--) { p[i] *= x; } } for (int i = 0; i <= n; i++) { result += p[i]; } return result; }
参考文献
https://www.hrwhisper.me/leetcode-count-numbers-unique-digits/
leetcode_357 Count Numbers with Unique Digits
最新推荐文章于 2020-06-05 12:35:22 发布