剑指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(不考虑大数问题)

使用Math.pow()函数即可

class Solution {
    public int[] printNumbers(int n) {
        int sum = 0;
        while(n>0){
            n=n-1;
            sum += 9*Math.pow(10,n);
        }
        int[] res = new int[sum];
        for(int i=1;i<=sum;i++){
            res[i-1]=i;
        }
        return res;
    }
}

解法2(考虑大数问题)

题解转载自简书:SunChaser_lilu
思路:当输入n很大时,使用int或long都会溢出。需要考虑大数问题。
可以借用字符串或数组表示大数。首先把字符串中的每一个数字初始化为’0’,然后每一次为字符串表示的数加1,再打印出来。因此,我们只需要做两件事:一是在字符串表示的数字上模拟加法;二是把字符串表示的数字打印出来。
在模拟加法的过程中需要判断是否已经到了最大的n位数,如果使用库函数则时间复杂度为O(n)。在加法的过程中如果字符串的第一个字符产生了进位,则已经到达了最大的n位数。可以实现O(1)时间判断是否已经达到了最大的n位数。
打印字符串表示的数字时,字符串开始的0不必打印。例如’068’打印68

increment函数,若发生进位则一直进行for循环,直到不产生进位则break。如果i为0(即到了最高位)还发生了进位,则设置isOverflow为true,并返回至主函数的while判断。

class Solution {
    public int[] printNumbers(int n) {
        int[] res = new int[n];
        StringBuilder str = new StringBuilder();
        //初始化一个全为’0‘的字符串
        for(int i =0;i<n;i++){
            str.append('0');
        }
        while(!increment(str)){
            //去除前面的0然后打印
            int index = 0;
            //index最后停留在第一个非0的位置
            //str.chaAt()得到的是字符
            while(str.charAt(index)=='0'&&index<str.length()-1){
                index++;
                }
                System.out.println(str.toString().substring(index));
            }
        return res;
    }

   public boolean increment(StringBuilder str){
       boolean isOverflow = false;
       for(int i=str.length()-1;i>=0;i--){
           //给该数字+1
           char s = (char)(str.charAt(i)+1);
           //如果s>'9',则发生了进位,给str.charAt(i)+1,不退出循环
           //i++后str.charAt(i)+1(相当于进位)
           if(s>'9'){
               //替换str中的字符要用“ ”(String类型而不是char类型)
               str.replace(i,i+1,"0");
               if(i==0){
                   isOverflow = true; 
               }
           }
           //如果未发生进位,则退出此次循环,得到一个新的str值
           else{
               //替换str中的字符要用String类型而不是char类型
               str.replace(i,i+1,String.valueOf(s));
               break;
           }
       }
       return isOverflow;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值