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

来源:互联网 发布:用友网络未来市值万亿 编辑:程序博客网 时间:2024/06/05 02:34

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;    }}
0 0
原创粉丝点击