357. Count Numbers with Unique Digits

本文介绍了一个简单的编程问题:计算0到10^n范围内所有数字中,每位数字都不重复的数字总数。采用动态规划思想,通过排列组合的方式计算不同位数的数字数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Question

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

2.Code

class Solution {
public:
    int countNumbersWithUniqueDigits(int n) {
        if(n > 10) n = 10;
        int sum = 1;   //初始化sum=1是为了先把 数字0 给记录进去
        int count;   //
        int factor = 10;  //初始化factor为10,方便计算
        while(n-- > 0) {
            if(factor == 10) //factor对应于最高位,共有9个选择,次高位也是9个选择。
                count = 9;
            else
                count *= factor;
            sum += count;
            factor--;
        }
        return sum;
    }
};

3.Note

1. 好久没做题没写博客了。记录一个简单的题吧。DP的思想。目标是求0~10^n中的数字,这个数字自身的每一位都是不重复的。

那么根据排列组合的思想,对于一个k位数,最高位有9个选择(1~9),次高位有9个选择(0~9再除去最高位的数字),第三高位有8个选择……以此类推。那么,对于一个k+1位数,可以利用计算k位数的结果,这也就是DP的思想了。

那么我们求0~10^n的个数,其实就是计算1~9,10~99,100~999,……,10^(n-1)~10^n - 1中包括多少个数。详情见代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值