PROBLEM
剑指 Offer 17. 打印从1到最大的n位数
难度 简单
MY ANSWER
题目设置有问题,所以没考虑大数,时间复杂度O(10^n),空间复杂度O(10^n)。
class Solution { public: vector<int> printNumbers(int n) { vector<int> res; int x = 1; x = pow(10, n); for(int i = 1; i < x; i++) { res.push_back(i); } return res; } };
|
BETTER SOLUTION
考虑大数,使用string储存大数,使用递归生成数的字符串,去除前导0后加入string向量中。
#include <iostream> #include <string> #include <vector>
using namespace std;
int n; vector<string> nums; vector<string> digit = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
void printnum(string num) { if(num.size() == n) { string zero(n, '0'); if(!zero.compare(num)) { return; } for(int i = 0; i < num.length() ; i++) { if(num[i] == '0') { num.erase(i, 1); i--; } else { break; } } nums.push_back(num); return; } else { for(int i = 0; i < 10; i++) { printnum(num + digit[i]); } return; } }
int main() { cin >> n; for(int i = 0; i < 10; i++) { printnum(digit[i]); } cout << nums.size() << endl; for(int i = 0; i < nums.size(); i++) { cout << nums[i] << ", "; } }
|
SUMMARY
注意考虑大数时,使用字符串储存,递归生成自负床,并进行去除前导0。