【剑指 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);
        }
    }
};

 

posted @ 2021-04-07 17:06  蓦然闻声  阅读(60)  评论(0编辑  收藏  举报