给你一个整数 n ,统计并返回各位数字都不同的数字 x 的个数,其中 0 <= x < 10n 。
示例 1:
输入:n = 2
输出:91
解释:答案应为除去 11、22、33、44、55、66、77、88、99 外,在 0 ≤ x < 100 范围内的所有数字。
示例 2:
输入:n = 0
输出:1
提示:
0 <= n <= 8
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-numbers-with-unique-digits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
可以考虑模拟,将模拟形成的数字转为字符串,然后逐一的放入一个set中,最后看set.size()不为一的个数;
根据规律,当n=0时,有1个,当n=1时有10个,当n=2时,有99+1个,依次类推,后面的每一位上会比前面少一个值(因为不能重复),所以就有了如下的想法:每次循环得到的个数等于9+num,num每次不一样,但都与出现的顺序相关,即num = num(10-i)
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
// n=0, count=1
//n=1, count=10;
//n=2, count=9*9+10;
//n=3, count=9*9*8+f(2);
int count = 1, product=9;
for(int i=1; i<10&&i<=n; i++)
{
count = product + count;
product *= (10-i);
}
return count;
}
};