剑指 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 为正整数

解一

解题思路

 计算出最大的 n 位十进制数,并循环输出

 时间复杂度O(10n),空间复杂度O(10n)

代码

class Solution {
    public int[] printNumbers(int n) {
        int maxNumber=1;
        for(int i=0;i<n;i++){
            maxNumber=maxNumber*10;
        }
        maxNumber=maxNumber-1;
        int res[]=new int[maxNumber];
        for(int i=1;i<=maxNumber;i++){
            res[i-1]=i;
        }
        return res;
    }
}

解二

解题思路

 原题考察点为大数计算,int和long型都有可能溢出,字符串类型不会溢出。按加法进位的逻辑来解:

 时间复杂度O(10n),空间复杂度O(10n)

代码

class Solution {
    public int[] printNumbers(int n) {
        StringBuilder str=new StringBuilder();
        for(int i=0;i<n;i++){
            str.append("0");
        }
        int[] res = new int[(int)Math.pow(10,n)-1];//Math.pow返回类型是double
        int countRes=0;
        while(!isMaximum(str)){
            //isMaximum当溢出时返回true
            int indexZero=0;
            while(indexZero<n && str.charAt(indexZero)=='0'){
                indexZero++;
            }
            res[countRes]=Integer.parseInt(str.toString().substring(indexZero));
            countRes++;
        }
        return res;   
    }
    public boolean isMaximum(StringBuilder str){
        boolean isCarry=false;
        for(int i=str.length()-1;i>=0;i--){
            //每次循环都从最低位开始
            //1. 不进位时,退出循环,并在主函数中获取字符串+1后的值:
            //   例如str从00012->00013
            //2. 进位时,不退出循环,i--代表i指向更高一位,更高一位上的数(0)加1:
            //   例如0099->0090->0000->0100
            char current=(char)(str.charAt(i)+1);
            if(current>'9'){
                str=str.replace(i,i+1,"0");
                if(i==0){//i为0时,是数字的最高位。最高位为0说明溢出了
                    isCarry=true;
                }
            }else{
                str.replace(i,i+1,String.valueOf(current));
                break;
            }
        }
        return isCarry;
    }
    
}
posted @ 2021-04-05 18:50  五斗橱哪位啊v  阅读(99)  评论(0)    收藏  举报