LeetCode 357. Count Numbers with Unique Digits 题解

357. Count Numbers with Unique Digits

 
  My Submissions
  • Total Accepted: 19808
  • Total Submissions: 44589
  • Difficulty: Medium
  • Contributors: Admin

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

Show Hint 

    解题思路:

    本题即为一道简单的组合数学题。显然n>=10时的取值与n=10时的取值相同。因为11位数必然有相同的数字。
    注意到n=0时,结果为1。n=1时结果为10=1+9(数字为0~9)。n=2时结果为91=10+9*9;n=3时结果为91+9*9*8。n=4时结果为(91+9*9*8)+(9*9*8*7).
    其余情况依次类推。

    代码展示:

    class Solution {
    public:
        int countNumbersWithUniqueDigits(int n) {
            vector<int> res;
            res.push_back(10);
            if(n==0) return 1;
            if(n==1) return 10;
            if(n>10) n=10; 
            int fac =9;
            for(int i=1;i<n;i++)
            {
                fac = fac*(10-i);
                res.push_back(res[i-1]+fac);
            }
            return res[n-1];
            
        }
    };


    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值