校招算法笔面试 | 打印从1到最大的n位数

题目

题目链接

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

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

JZ66. 构建乘积数组

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

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

思路:

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

具体做法:

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

图示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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 ( 1 0 n ) O(10^n) O(10n),需要输出一共 1 0 n − 1 10^n-1 10n1个数字
  • 空间复杂度: O ( 1 ) O(1) O(1),res属于返回必要空间,无额外辅助空间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值