• Count Numbers with Unique Digits


    Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n.

    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])

    Hint:

      1. A direct way is to use the backtracking approach.
      2. Backtracking should contains three states which are (the current number, number of steps to get that number and a bitmask which represent which number is marked as visited so far in the current number). Start with state (0,0,0) and count all valid number till we reach number of steps equals to 10n.
      3. This problem can also be solved using a dynamic programming approach and some knowledge of combinatorics.
      4. Let f(k) = count of numbers with unique digits with length equals k.
      5. f(1) = 10, ..., f(k) = 9 * 9 * 8 * ... (9 - k + 2) [The first factor is 9 because a number cannot start with 0].

    题目大意:

    给一个非负整数n,找出[0,10^)之间各个位上数字不重复出现的数的个数,如n = 3,找出[0,1000)之间符合标准的数,如123,245,但122不符合要求,2重复出现。

    根据提示,题目可以用回溯和动态规划解决。这里使用的动态规划做的。看了讨论区,复杂度还可以降低

     1 public class Solution {
     2     public int countNumbersWithUniqueDigits(int n) {
     3         if(n == 0)
     4             return 1;
     5         int result[] = new int[11];
     6         result[1] = 10;     
     7       
     8         int preFactor = 9;
     9         for(int i = 2; i <= 10 && i <= n; i++){
    10             preFactor *= (9 - i + 2);
    11             result[i] = (preFactor + result[i - 1]);
    12         }//for
    13         
    14         if(n > 10)
    15             return result[10];
    16         return result[n];
    17     }
    18 }
  • 相关阅读:
    每日日报
    HTML相关
    60-Shiro功能扩展(记住我)
    60--Shiro安全框架
    服务器项目部署简单操作
    61--DB项目--修改密码模块设计
    59-SpringAOP --Cache操作(注解)
    58-Spring AOP 异步操作
    58-Spring-AOP事务管理
    Terminal 执行 java 命令
  • 原文地址:https://www.cnblogs.com/luckygxf/p/5586545.html
Copyright © 2020-2023  润新知