• [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;
        }
  • 相关阅读:
    1、如何使用Azure Rest API创建虚拟机
    Ansible---2的Roles使用
    linux下的shell脚本
    生成器 yield和协程
    xshell
    markdown的使用
    加密
    Hbuilder打包app
    尾递归
    jupyter
  • 原文地址:https://www.cnblogs.com/Moriarty-cx/p/9697293.html
Copyright © 2020-2023  润新知