剑指offer面试题17:打印从1到最大的n位数

题目要求:输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999

解题思路:
1.首先暴力法遍历可以求解,但是大整数问题需要另一种思路
2.构建一个StringBuilder字符串,输入的n为多少,就赋多少个0。
3.当该字符串没有发生位数溢出的时候,循环打印
4.首先从最小位数开始累加,最开始为’0’,每次循环+1,一直到’9’
5.当该位为’9’的时候,再+1发生进位,则将该位变为0(StringBuilder的replace函数),然后for循环对它下一位数加1。
6.若当前位没有发生进位,则跳出循环到外部方法中打印。

public class Solution {
    boolean isOverflow = false;
    public int[] printNumbers(int n) {
        ArrayList<Integer> arrayList=new ArrayList<Integer>();
        // 将str初始化为n个'0'字符组成的字符串
        StringBuilder str = new StringBuilder();
        for(int i=0;i<n;i++){
            str.append("0");
        }
        //调用一个累加函数对位数进行累加,当位数超过n停止
        while(!increment(str)){
        //去掉字符串前的0输出:例如002输出2
            int index=0;
            while(index<str.length()-1&&str.charAt(index)=='0'){index++;}
            arrayList.add(Integer.valueOf(str.toString().substring(index)));
        }
    //这些是为了leetcode要求输出写的代码
        int[] array=new int[arrayList.size()];
        int arrayindex=0;
        for (Integer temp:arrayList) {
            array[arrayindex]=temp;
            arrayindex++;
        }

        return array;
    }

    public boolean increment(StringBuilder str) {
        for (int i = str.length() - 1; i >= 0; i--) {
            char s = (char)(str.charAt(i) + 1);
            // 如果s大于'9'则发生进位
            if (s > '9') {
                str.replace(i,i+1,"0");
                if (i == 0) {
                    isOverflow = true;
                }
            }
            // 没发生进位则跳出for循环
            else {
                str.replace(i,i+1,String.valueOf(s));
                break;
            }
        }
        return isOverflow;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值