Leetcode 357. Count Numbers with Unique Digits 统计没有重复数字的数 解题报告

1 解题思想

这道题其实是一个高中数学题(其实也是考研概率论的题目)
其做法也就是一个排列组合的关系,因为我们需要统计0~10^n里面不包含重复数字的所有数字,所以其实很简单:
对于位数为i的情况
1、第一位不能为0,所以要从1~9里面挑一个C(9,1)种组合方式
2、之后的i-1位,1~9里面任意挑选I-1个出来,共计C(9,i-1)种组合方式
3、对于之后I-1的数字,共有A(i-1,i-1) 或者理解为(i-1)! 种排列方式
4、上面三个相乘就是目标结果了。

特列:
对于n=0和1需要特殊处理,简单,不说了

因此,解法就是把从0到n都算一遍相加就好了。。喵

2 原题

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

3 AC解

public class Solution {

    /**
     * 这里用来做阶乘的
     * */
    public static int[] cache = new int[16];
    public int fact(int n){
        if(n>1 && cache[n]==0)
            cache[n]=fact(n-1)*n;
         return cache[n];
    }
    /**
     * 数学里的那个选择函数。。不过抱歉,我忘了叫什么名字了,选择?
     * */
    public int C(int a,int b){
        return fact(a)/(fact(b) * fact(a-b));
    }
    /**
     * 数学里的那个选择函数。。计算机里就是a个数组挑b个进行排列组合
     * */
    public int A(int a,int b){
        return fact(a)/fact(a-b);
    }

    public int countNumbersWithUniqueDigits(int n) {
        cache[1] = 1;
        cache[0] = 1;
        int result = 1;
        if (n >=1) result += 9;
        //除了开头不能为0以外,其他都可以
        for(int i=2;i<=n;i++) result += C(9,1)*C(9,i-1)*A(i-1,i-1);
        return result;


    }
}

你可能感兴趣的:(leetcode-java,leetcode,数学,考研,组合,排列)