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

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

示例 1:

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

思路:不考虑大数问题就直接创建一个长度为pow(10,n)-1的递增数组就完事了。

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

考虑大数问题的话,方法返回值为1~pow(10,n)-1的字符串。先固定高位的0-9的值,再固定低位0-9的值,因此直接使用递归可以遍历出1~pow(10,n)-1。

    int n;
    StringBuilder res; //数字的全排列
    StringBuilder num; //拼接的单个数字
    char[] ch = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; //0-9字符数组

    public String printNumbers(int n) {
        this.n = n;
        this.res = new StringBuilder();
        this.num = new StringBuilder();
        dfs(0);
        res.deleteCharAt(res.length() - 1); //删除最后位的‘,’
        return res.toString();
    }

    public void dfs(int index){
        if(index == n){ // 递归出口,所有位数固定完成
            if(num.length() > 0){
                res.append(num);
                res.append(",");
            }
            return;
        }
        for (int i = 0; i < 10; i++){
            if(!(res.length() == 0 && i == 0)){ //如果高位不为0才拼接数字
                num.append(ch[i]);
            }
            dfs(index + 1);
            if(num.length() > 0){
                num.deleteCharAt(num.length() - 1); // 回溯后去掉最后一位数字
            }
        }
    }

参考:https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof

上一篇:Vue过渡效果


下一篇:vue 组件transition