357. Count Numbers with Unique Digits(唯一数的个数——dp+math)

给定一个非负整数n,计算所有具有唯一数字x的数字,其中0≤x <10 n。

例:

输入:2
输出:91
说明:答案应该是0≤x <100范围内的总数,
不包括 11,22,33,44,55,66,77,88,99

根据dp来说,n为1:10个,为2 :9*9(因为0~9还有九个数字可以用);为3时,在为2的基础上还可以选择8个数字,往后乘的数依次递减,直到为1,那时候说明n的值已经大于了9,说明数的范围到了10000 0000 00 这个时候已经不可能再有唯一数了,因为总共0~9就十个数。
所以那之后的数结果就是n=9.

code:

class Solution {
public:
    int countNumbersWithUniqueDigits(int n) {
        //根据dp来说,n为1:10个,为2 :9*9(因为0~9还有九个数字可以用);为3时,在为2的基础上还可以选择8个数字
        if(n==0)    return 1;   //仅有结果:0】
        int res=10;     //f(1)
        int uniqueNum=9, avalible=9;
        while( n-->1&& avalible>0)      //从2开始.     当n>9之后,是没有唯一数的。avalib递减
        {
            uniqueNum=uniqueNum*avalible;
            res+=uniqueNum;
            avalible--;
        }
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值