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

来源:互联网 发布:java小游戏源代码文件 编辑:程序博客网 时间:2024/06/03 17:58

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。

0 0
原创粉丝点击