独特的数(一) c++ 时间限制:1s 内存限制:128M 【题目描述】 如果一个正整数的十进制表示的每一位数码都不同,则称它为独特的数。 小猴想要知道按照从小到大的顺序中,第 n 个独特的数是哪一个整数(0 不算独特的数),请你帮助小猴编写程序完成这个问题。
时间: 2024-12-13 16:20:55 浏览: 6
这是一个典型的动态规划问题,可以使用“回溯”算法来解决。首先,我们需要从最小的独特数字开始考虑,即每个位都是1,然后逐步增加下一个位置的数值,同时保证前面的每一位都不重复。我们可以定义一个数组`unique`记录当前已经尝试过的每一位数,以及一个变量`count`跟踪找到的独特数字的数量。
下面是一个简单的C++实现:
```cpp
#include <vector>
using namespace std;
bool isUnique(int num) {
vector<bool> used(10, false);
while (num > 0) {
int digit = num % 10;
if (used[digit]) return false;
used[digit] = true;
num /= 10;
}
return true;
}
int uniqueNumber(int n) {
vector<int> uniqueCount(10, 0); // 前十个数分别对应0-9
for (int i = 1; i <= 9; ++i) {
uniqueCount[i] = uniqueCount[i - 1] + isUnique(i); // 计算包含i作为首位的独特数
}
int ans = 0;
for (int i = 10; ; ++i) { // 从十位开始尝试其他数字
ans += uniqueCount[i - 1];
bool found = true;
for (int j = 0; j < 9 && found; ++j) { // 检查剩余的九位是否可用
if (!isUnique(ans * 10 + j + 1)) found = false;
}
if (found) return ans;
}
}
int main() {
int n;
cin >> n;
cout << uniqueNumber(n) << endl;
return 0;
}
```
阅读全文