这道提取实际上要考虑大数的越界问题,n较大时,数值可能会超出int32的问题,虽然题目中不考虑,但是实际面试中是肯定要体现出来的,所以需要使用字符串表示大数。
根据leetcode大佬的题解,实际上我们有两个问题要考虑
(1)生成数字的字符串集,这里我们可以采用全排列的方式考虑,这样可以避免了考虑进位的操作。基于分治的思想,我们可以固定高位,然后向低位递归,当个位i而已经被固定时,说明该出自已经确定,打印该数字。
(2)删除高位多余的零,这一步其实实现起来也相对容易,直接截取字符串就好啦。
代码:
class Solution {
private:
vector<int> nums;
string s;
public:
vector<int> printNumbers(int n) {
s.resize(n, '0');
dfs(n, 0);
return nums;
}
// 枚举所有情况
void dfs(int end, int index) {
if (index == end) {
save(); return;
}
for (int i = 0; i <= 9; ++i) {
s[index] = i + '0';
dfs(end, index + 1);
}
}
// 去除首部0
void save() {
int ptr = 0;
while (ptr < s.size() && s[ptr] == '0') ptr++;
if (ptr != s.size())
nums.emplace_back(stoi(s.substr(ptr)));
}
};