题目

给你一个整数 n ,统计并返回各位数字都不同的数字 x 的个数,其中 0 <= x < 10^n 。

示例 1:

输入:n = 2
输出:91
解释:答案应为除去 11、22、33、44、55、66、77、88、99 外,在 0 ≤ x < 100 范围内的所有数字。

示例 2:

输入:n = 0
输出:1

提示:

0 <= n <= 8

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-numbers-with-unique-digits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

就是一个高中数学题,累加从357. 统计各位数字都不同的数字个数 - 图1位到357. 统计各位数字都不同的数字个数 - 图2位各位都不同的数的个数就是答案。357. 统计各位数字都不同的数字个数 - 图3位的有357. 统计各位数字都不同的数字个数 - 图4个,357. 统计各位数字都不同的数字个数 - 图5位的有357. 统计各位数字都不同的数字个数 - 图6个,357. 统计各位数字都不同的数字个数 - 图7位的有357. 统计各位数字都不同的数字个数 - 图8个,357. 统计各位数字都不同的数字个数 - 图9位的有357. 统计各位数字都不同的数字个数 - 图10个,…一直累加到357. 统计各位数字都不同的数字个数 - 图11位即可。

特别地,357. 统计各位数字都不同的数字个数 - 图12357. 统计各位数字都不同的数字个数 - 图13时返回357. 统计各位数字都不同的数字个数 - 图14

代码

  1. class Solution {
  2. public int countNumbersWithUniqueDigits(int n) {
  3. if (n == 0) {
  4. return 1;
  5. }
  6. int ans = 10;
  7. for (int i = 2; i <= n; i++) {
  8. int cur = 9 * 9;
  9. int k = 8;
  10. for (int j = i + 1; j <= n; j++) {
  11. cur *= k;
  12. k--;
  13. }
  14. ans += cur;
  15. }
  16. return ans;
  17. }
  18. }

官解的这个代码实现起来更加优雅

  1. class Solution {
  2. public int countNumbersWithUniqueDigits(int n) {
  3. if (n == 0) {
  4. return 1;
  5. }
  6. if (n == 1) {
  7. return 10;
  8. }
  9. int res = 10, cur = 9;
  10. for (int i = 0; i < n - 1; i++) {
  11. cur *= 9 - i;
  12. res += cur;
  13. }
  14. return res;
  15. }
  16. }