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×...×(9−n+1)
计算的,那基本上就能把这道题做出来。
国庆前一天填的坑,明天加油~国庆假期也会保持填坑的,O(∩_∩)O。