您的位置:首页 > 产品设计 > UI/UE

leetcode_357 Count Numbers with Unique Digits

2016-06-20 10:02 483 查看
题意分析:给定非负的整数n,求在0<=x<10^n中,有多少每个位上的数字互不相同的数?如n=2时,范围为[0,100],共有91个数(除了11,22,33,44,55,66,77,88,99)。

解题思路

统计规律如下:

i = 1时,10个
i = 2时,10个 + 9*9个
i = 3时,10个 + 9*9个 + 9*9*8个
i = 4时,10个 + 9*9个 + 9*9*8个 + 9*9*8*7个
......
i = n时,10个 + 9*9个 + 9*9*8个 + 9*9*8*7个 + ... + 9*9*8*7*...*(9-i+2)


根据以上分析,便可编写程序实现。

C++实现

// 直接求解实现
int countNumbersWithUniqueDigits1(int n)
{
if (n == 0)
return 1;
int result = 10;
if (n == 1)
return result;
int temp = 9;
for (int i = 2; i <= n; i++)
{
temp = temp * (9 - i + 2);
result += temp;
}
return result;
}
// 利用额外数据进行实现(类似动态规划思想)
int countNumbersWithUniqueDigits(int n)
{
n = min(n, 10);
int *p = new int[n+1];
for (int i = 0; i <= n; i++)
{
p[i] = 9;
}
p[0] = 1;
for (int i = 2; i <= n; i++)
{
for (int x = 9; x >= 9 - i + 2; x--)
{
p[i] *= x;
}
}
int result = 0;
for (int i = 0; i <= n; i++)
result += p[i];
return result;
}


Java实现

// 直接实现
public int countNumbersWithUniqueDigits(int n) {
if (n == 0)
return 1;
if (n == 1)
return 10;
int result = 10;
int temp = 9;
for (int i = 2; i <= n; i++) {
temp *= (9 - i + 2);
result += temp;
}
return result;
}
// 利用额外数据进行实现(类似动态规划思想)
public int countNumbersWithUniqueDigits(int n) {
if (n == 0)
return 1;
if (n == 1)
return 10;
int [] p = new int[n + 1];
for (int i = 0; i <= n; i++)
p[i] = 9;
int result = 0;
p[0] = 1;
for (int i = 2; i <= n; i++) {
for (int x = 9; x >= 9 - i + 2; x--) {
p[i] *= x;
}
}
for (int i = 0; i <= n; i++) {
result += p[i];
}
return result;
}


参考文献

https://www.hrwhisper.me/leetcode-count-numbers-unique-digits/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息