zoukankan      html  css  js  c++  java
  • [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, 
                 excluding 11,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;
        }
  • 相关阅读:
    GoldenGate 19.1实时文本文件加载攻略
    windows 10 excel 打开超连接提示 组织策略阻止...
    验证ogg同步数据库表无主键表且目标表包含隐藏字段
    配置ogg从Oracle到PostgreSQL的同步复制json数据
    pi
    GoldenGate 19.1 发布
    ogg同步DDL时,源和目标端表空间名称不同的解决思路
    总目录索引(开发精华总结)
    Spring Cloud Nacos分布式配置中心
    Spring Cloud Nacos&Feign负载均衡
  • 原文地址:https://www.cnblogs.com/Moriarty-cx/p/9697293.html
Copyright © 2011-2022 走看看