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

Posted 放羊的牧码

tags:

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

题目链接:点击打开链接

题目大意:

解题思路:

相关企业

  • 微软(Microsoft)

AC 代码

// 解决方案(1)
class Solution 
    public int[] printNumbers(int n) 
        int len = 0;
        for (int i = 0; i < n; i++) 
            len = len * 10 + 9;
        

        int[] arr = new int[len];
        for (int i = 1; i <= len; i++) 
            arr[i - 1] = i;
        

        return arr;
    


// 解决方案(2)
class Solution 
    StringBuilder res;
    int count = 0, n;
    char[] num, loop = '0', '1', '2', '3', '4', '5', '6', '7', '8', '9';
    public String printNumbers(int n) 
        this.n = n;
        res = new StringBuilder(); // 数字字符串集
        num = new char[n]; // 定义长度为 n 的字符列表
        dfs(0); // 开启全排列递归
        res.deleteCharAt(res.length() - 1); // 删除最后多余的逗号
        return res.toString(); // 转化为字符串并返回
    
    void dfs(int x) 
        if(x == n)  // 终止条件:已固定完所有位
            res.append(String.valueOf(num) + ","); // 拼接 num 并添加至 res 尾部,使用逗号隔开
            return;
        
        for(char i : loop)  // 遍历 ‘0‘ - ’9‘
            num[x] = i; // 固定第 x 位为 i
            dfs(x + 1); // 开启固定第 x + 1 位
        
    

输入:n = 1
输出:"0,1,2,3,4,5,6,7,8,9"

输入:n = 2
输出:"00,01,02,...,10,11,12,...,97,98,99"

输入:n = 3
输出:"000,001,002,...,100,101,102,...,997,998,999"

// 去除前置 0
class Solution 
    StringBuilder res;
    int nine = 0, count = 0, start, n;
    char[] num, loop = '0', '1', '2', '3', '4', '5', '6', '7', '8', '9';
    public String printNumbers(int n) 
        this.n = n;
        res = new StringBuilder();
        num = new char[n];
        start = n - 1;
        dfs(0);
        res.deleteCharAt(res.length() - 1);
        return res.toString();
    
    void dfs(int x) 
        if(x == n) 
            String s = String.valueOf(num).substring(start);
            if(!s.equals("0")) res.append(s + ",");
            if(n - start == nine) start--;
            return;
        
        for(char i : loop) 
            if(i == '9') nine++;
            num[x] = i;
            dfs(x + 1);
        
        nine--;
    


// 整型化(最终版)
class Solution 
    int[] res;
    int nine = 0, count = 0, start, n;
    char[] num, loop = '0', '1', '2', '3', '4', '5', '6', '7', '8', '9';
    public int[] printNumbers(int n) 
        this.n = n;
        res = new int[(int)Math.pow(10, n) - 1];
        num = new char[n];
        start = n - 1;
        dfs(0);
        return res;
    
    void dfs(int x) 
        if(x == n) 
            String s = String.valueOf(num).substring(start);
            if(!s.equals("0")) res[count++] = Integer.parseInt(s);
            if(n - start == nine) start--;
            return;
        
        for(char i : loop) 
            if(i == '9') nine++;
            num[x] = i;
            dfs(x + 1);
        
        nine--;
    

以上是关于LeetCode(剑指 Offer)- 17. 打印从1到最大的n位数的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

用 Go 剑指 Offer 17. 打印从1到最大的n位数

算法---- Leetcode剑指offer-Java版题解

算法---- Leetcode剑指offer-Java版题解