剑指OFFER笔记_17_打印从1到最大的n位数_JAVA实现

题目:打印从1到最大的n位数

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

解题思路

  • 此题力扣的要求很低,因为规定了函数的返回类型是int[],所以注定不会实现n过大导致int类型无法存储的情况,所以我选择了加大难度。
  • 当n较大的时候,我们用int无法存储了,即使是用long long 也会有越界的情况。我选择采用字符数组来存储。
  • 若输入n为3,则可以理解为有三个数位,每个数位都从0~9遍历一遍就可以输出所有的情况了。其中需要排除000的情况,此外还有一种情况就是前几位为0,如004,056这种情况,输出的时候不需要输出字符数组前面的‘0’,稍加处理即可。

代码

函数主体部分代码

package q17;

/**
 * 输入数字n,按顺序打印出从1到最大的n位十进制数。
 */
public class Solution {

    /**
     * 输出从1到最大的n位数
     * @param n
     */
    public void printNumbers(int n) {
        if(n <= 0)
        {
            System.out.println("ERROR");
            return;
        }
        char[] chars = new char[n];

        //存储n和当前的下标
        int length = n;
        int index = 0;

        for (int i = 0; i < 10; i++) {
            //改变chars的第0位
            chars[0] = (char)('0'+ i );
            //递归处理
            printRecursively(chars, index, length);
        }

    }

    public void printRecursively(char[] chars, int index, int length)
    {
        //全部置位后,可以输出
        if (index == length-1)
        {
            print(chars);
            return;
        }

        //否则,往后一位置位,然后继续递归
        for (int i = 0; i < 10; i++) {
            chars[index+1] = (char)('0' + i);
            printRecursively(chars, index+1, length);
        }

    }

    public void print(char[] chars)
    {
        //异常处理
        if (chars == null)
        {
            return;
        }

        int index = 0;
        while(chars[index] == '0')
        {
            //若全为0,直接返回不输出。
            if (index == chars.length-1)
            {
                return;
            }
            index++;
        }
        //从第一个非0开始输出。
        for (int i = index; i < chars.length; i++) {
            System.out.print(chars[i]);
        }
        System.out.println();
    }
}

测试部分代码

package q17;

public class TestApp {
    public static void main(String[] args) {
        Solution s = new Solution();
        s.printNumbers(0);
        s.printNumbers(3);
    }
}

运行结果截图

在这里插入图片描述
在这里插入图片描述

LeetCode运行截图

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值