给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n。
示例:
给定 n = 2,返回 91。(答案应该是除[11,22,33,44,55,66,77,88,99]
外,0 ≤ x < 100 间的所有数字)
一道简单的数数问题,没去想简单的方法,直接枚举判断是否符合条件。
这里判断的时候用到了set判断是否有重复元素。细节见代码:
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
if (n == 0)
{
return 1;
}
if (n == 1)
{
return 10;
}
set<int> res;
int result = 11;
int end = 1;
int t = 0;
bool flag = false;
while (t < n)
{
end *= 10;
t++;
}
int start = 0;
for (int i = 11; i < end; i++)
{
flag = false;
start = i;
res.clear();
while (start > 0)
{
int temp = start % 10;
start = start / 10;
if (res.find(temp) != res.end())
{
flag = true;
break;
}
else
{
res.insert(temp);
}
}
if (!flag)
{
result++;
}
}
return result;
}
};
人如其码,是的很挫的一段代码,虽然能够跑通,但是在n=7时提示超时,没办法只能找规律进行改进。用到组合数的思想,每增加一个位置,可选择的数字就少一个。
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
if (n == 0)
{
return 1;
}
int result = 10;
int count = 9;
for (int i = 1; i < n;i++)
{
result += count*(10 - i);
count *= (10 - i);
}
return result;
}
};