38.打印从1到最大的n位数(考虑大数&全排列)

在这里插入图片描述
类似全排列题目
全排列(不重复的数字版+递归回溯)
字符串全排列(重复字符版)

实际考点,返回字符串的打印形式
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

class Solution {

    int[] res;//存放最终的结果
    /**
    nine:统计每一个n位数中出现9的个数
    count:res[]数组中的下标
    start:位有效数字的起始位的序号
     */

    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用来存放每次一个n位数的容器
        num = new char[n];
        //start为初始化的有效位的起始位置
        start = n - 1;

        dfs(0);
        return res;
    }


    void dfs(int x) {

        //每次达到深度为n时,恰好生成一个数(递归终止)
        if(x == n) {
            //截取有效数位进行存储
            String s = String.valueOf(num).substring(start);

            if(!s.equals("0")){//不要0,从1开始计数
                res[count] = Integer.parseInt(s);
                count++;
            }


            //判断是否需要更新start的起始有效序号的位置
            //注意start的调整实际上是按照数的大小进行调整的(例如:n=3时,009--010--099--100),所以将start调整放在存放每个数的时候           
            if(n - start == nine) {
                start--;
            }
            return;
        }


        //for循环用来回溯,注意:for循环内不属于小回溯(同层位进行调整遍历),for循环结束实际上是大回溯(向高一位)
        //nine需要在每次本位向高位回溯的时候需要调整(本层的for循环结束后--),以及本位本身遇到9是需要调整(for层循环内部++)
        for(char i : loop) {
            if(i == '9') nine++;
            num[x] = i;
            dfs(x + 1);
        }
        nine--;
    }
}

substring学习
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值