LeetCode 357. Count Numbers with Unique Digits 解题报告

LeetCode 357. Count Numbers with Unique Digits 解题报告

题目描述

Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n.


示例

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


限制条件

没有明确给出。


解题思路

我的思路:

这道题其实就是一道数学题。
考虑一位数的情况,有10个,分别是0-9。
考虑两位数的情况,十位上只能从1-9中选择,个位上是从0-9中不同于十位数的剩下9个数中选择: 9×9=81
考虑三位数的情况,百位上有9种选择,十位有9种(除去百位上的数),个位有8种(除去百位跟十位的数): 9×9×8=648
如此类推:对于n位的数,第n位有9种选择,第n-i位有9-i种选择。
所以当n=2时,就是把一位数跟两位数的结果相加: 10+81=91 。当n=3时,就是把一位数,两位数和三位数的结果相加: 10+81+648=739
按照这种思路,直接用代码实现出来即可。需要注意的是,当n>10时,结果是等同于n=10,在代码里i = 10时,multi *= (10 - i) =0实现了n>10后,结果等于n=10的效果。

这种解法是很简单的了,通过后看了其它人解法,大体都是这样完成的,还有大牛用回溯法做的,但是没有理解就在这里不给出了(^__^) 嘻嘻……请不要打我。


代码

我的代码
class Solution {
public:
    int countNumbersWithUniqueDigits(int n)
    {
        int unique = 10;
        int multi = 9;

        for (int i = 1; i < n; i++) {
            multi *= (10-i);
            unique += multi;
        }

        return !n ? 1: unique;
    }
};

总结

这道题考的是基本的数理能力,只要在做的时候能够想到用0-9填n位是通过 9×8×...×(9n+1) 计算的,那基本上就能把这道题做出来。
国庆前一天填的坑,明天加油~国庆假期也会保持填坑的,O(∩_∩)O。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值