题目的主要信息:
  • 按照顺序从1输出到最大的十进制nn位数
举一反三:

学习完本题的思路你可以解决如下题目:

JZ66. 构建乘积数组

JZ44. 数字序列中某一位的数字

方法:数组输出(推荐使用)

思路:

既然是从1开始顺序输出到nn位数的最大值,一般来说nn位数最大就是nn个9,这样不方便于计算,可以直接遍历到n+1n+1位的最小值结束,即10n10^n

具体做法:

  • step 1:从1开始连乘10或者直接用次方计算10n10^n
  • step 2:从1遍历到10n110^n-1,将所有数字顺序加入数组。

图示:

alt

Java实现代码:

import java.util.*;
public class Solution {
    public int[] printNumbers (int n) {
        //找到该n+1位数的最小数字
        int end = 1;
        for(int i = 1; i <= n; i++)
            end *= 10;
        //从1遍历到n+1位数的最小数字输出
        int[] res = new int[end - 1];
        for(int i = 1; i < end; i++)
            res[i - 1] = i;
        return res;
    }
}

C++实现代码:

class Solution {
public:
    vector<int> printNumbers(int n) {
        vector<int> res;
        //找到该n+1位数的最小数字
        int end = 1;
        for(int i = 1; i <= n; i++)
            end *= 10;
        //从1遍历到n+1位数的最小数字输出
        for(int i = 1; i < end; i++)
            res.push_back(i);
        return res;
    }
};

Python实现代码:

class Solution:
    def printNumbers(self , n: int) -> List[int]:
        res = []
        #找到该n+1位数的最小数字
        end = 10 ** n
        #从1遍历到n+1位数的最小数字输出
        for i in range(1, end):
            res.append(i)
        return res

复杂度分析:

  • 时间复杂度:O(10n)O(10^n),需要输出一共10n110^n-1个数字
  • 空间复杂度:O(1)O(1),res属于返回必要空间,无额外辅助空间