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

目录

打印从1到最大的n位数

描述

示例 1

说明

方法一:迭代

方法二:大数解法


打印从1到最大的n位数

描述

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。

比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

示例 1

输入

n = 1

输出

[1,2,3,4,5,6,7,8,9]

说明

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

方法一:迭代

这个题思路比较清晰,首先利用10^n确定打印的范围,然后循环赋值即可。

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

方法二:大数解法

题目中没有考虑大数,但是鉴于面试题不会这么简单,所以我们将大数因素考虑进来重新实现。

如果10^n的值超出了int或者long所表示的范围,那么我们就需要考虑大数越界的打印情况。

我们用String类型来存储大数,使用全排列的方法生成所有数,打印[1,10^n-1]的数就是对n位数据,每一位进行0-9的全排列,首先我们对最高位确定,依次确定低一位的数据,排列完毕。

全排列的方法我们使用深度优先搜索。

class Solution {
    private StringBuffer res;
    int num;
    char[] val,number={'0','1','2','3','4','5','6','7','8','9'};

    public String printNumbers(int n) {
        num=n;
        res=new StringBuffer();
        val=new char[n];//创建长度为n的字符数组,存储全排列的数据
        dfs(0);
        res.deleteCharAt(res.length()-1);//删除最后的逗号
        return res.toString();
    }

    private void dfs(int m) {
        if (m==num){
            res.append(String.valueOf(val)+",");//将结果添加到res中,用逗号隔开
            return;
        }
        for (char i:number) {
            val[m]=i;//将第m位固定为字符i
            dfs(m+1);//深度搜索下一位数字的情况
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_39478524/article/details/120542881