【剑指 Offer 17. 打印从1到最大的n位数 简单】
【剑指 Offer 17. 打印从1到最大的n位数 简单】
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
说明:
用返回一个整数列表来代替打印
n 为正整数
1. 如果不考虑大数问题,那么十分简单:
class Solution { public: vector<int> printNumbers(int n) { vector<int> res; if(n <= 0) { return res; } int maxNum = 1; while(n > 0) { maxNum = 10 * maxNum; n--; } for(int i = 1; i < maxNum; i ++) { res.push_back(i); } return res; } };
2. 考虑大数问题
(1)使用字符串表示数字,用字符串加减模拟数字加减
class Solution { public: bool numStrIncrement(string& numStr, int len) { int takeOver = 0; bool isOverFlow = false; int sum; for(int i = len - 1; i >= 0; i--) { sum = numStr[i] - '0' + takeOver; if(i == len - 1) sum++; if(sum >= 10) { if(i == 0) { isOverFlow = true; } else { takeOver = 1; sum -= 10; numStr[i] = '0' + sum; } } else { numStr[i] = '0' + sum; break; } } return isOverFlow; } string removeUselessZero(string numStr, int len) { int i = 0; while(numStr[i] == '0') ++i; int remain = len - i; string res(remain, '0'); for(int j = 0; j < remain; j++) res[j] = numStr[j + i]; cout<<res<<endl; return res; } vector<string> printNumbers(int n) { string numStr(n, '0'); numStr[n-1] = '1'; vector<string> res; while(!numStrIncrement(numStr, n)) { //cout<<"=="<<numStr<<endl; res.push_back(removeUselessZero(numStr, n)); } return res; } };
利用排列组合的思想,需要使用递归:先固定当前位置,然后递归处理后续位置。
#include <iostream> #include <vector> #include <string> #include <stack> #include <set> #include <deque> #include <string> #include <unordered_set> using namespace std; class Solution { public:string removeUselessZero(string numStr, int len) { int i = 0; while(numStr[i] == '0') ++i; int remain = len - i; string res(remain, '0'); for(int j = 0; j < remain; j++) res[j] = numStr[j + i]; cout<<res<<endl; return res; }void printNumberRecursively(string& numStr, int index, vector<string>& res, int n ) { if(index == n - 1) { if(!(numStr == string(n, '0')) ) res.push_back(removeUselessZero(numStr, n)); return; } for(int i = 0; i <= 9; i++) { numStr[index + 1] = '0' + i; printNumberRecursively(numStr, index + 1, res, n); } } vector<string> printNumbersV2(int n) { string numStr(n, '0'); vector<string> res; for(int i = 0; i <= 9; i++) { numStr[0] = i + '0'; printNumberRecursively(numStr, 0, res, n); } } };