Leetcode——打印从1到最大的n位数

Posted Yawn,

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode——打印从1到最大的n位数相关的知识,希望对你有一定的参考价值。

1. 题目

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

示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]

说明:
用返回一个整数列表来代替打印
n 为正整数

2. 题解

很容易知道最大数字就是10的n次方-1

for循环:

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

考虑大数:
大数越界情况下的打印。需要解决以下三个问题:
在这里插入图片描述

class Solution{
    char[] digits = new char[]{'0','1','2','3','4','5','6','7','8','9'};
    char[] num;
    int n;
    StringBuilder res = new StringBuilder();

    private String printNumbers(int n){
        this.n = n;
        num = new char[n];
        dfs(0);
        res.deleteCharAt(res.length() - 1);
        return  res.toString();
    }
    //选择第x位上的数字(从0-9当中挑选一个)
    private void dfs(int x){
        if(x == n){
            StringBuilder numStr = new StringBuilder(String.valueOf(num));
            //去除所有前置的0
            boolean nonZero = false;
            for(int i = 0; i < numStr.length(); i++){
                if(numStr.charAt(i) != '0') nonZero = true;
                if(!nonZero && numStr.charAt(i) == '0'){
                    numStr.deleteCharAt(i);
                    //每次删除一个字符,后边的所有字符就会前移一位,所以删除的指针也要前移一位,否则会漏掉该删除的‘0’没有删
                    i--;
                }
            }
            //从1开始打印,所以排除掉“000”(经过删除后变为空串“”)的情况
            if(!numStr.toString().equals("")) res.append(numStr.toString()).append(",");
            return;
        }
        for(int i = 0; i < 10; i++){
            num[x] = digits[i];
            dfs(x + 1);
        }
    }
}

以上是关于Leetcode——打印从1到最大的n位数的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode-字符串打印从1到最大的n位数

LeetCode剑指 Offer 17. 打印从1到最大的n位数(C++)

Leetcode——打印从1到最大的n位数

[LeetCode]剑指 Offer 17. 打印从1到最大的n位数

LeetCode(剑指 Offer)- 17. 打印从1到最大的n位数

⭐算法入门⭐《线性枚举》简单10 —— LeetCode 剑指 Offer 17. 打印从1到最大的n位数