前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

28.算法学习之大数打印

qiguaw 2024-11-24 20:40:56 资源文章 9 ℃ 0 评论

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

示例

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


我的思路:这题目要求的是大数打印,也就是说我们使用int或者其他类型的数的话,会有溢出的情况,所以改题目核心思想是需要使用字符串来构建数值,来实现数值累加打印的效果。代码如下:

public static int[] printNumbers(int n) {
        int[] res = new int[(int) Math.pow(10, n) - 1];
        StringBuilder num = new StringBuilder();
        for (int i = 0; i < n; i++) {
            num.append("0");
        }
        int count = 0;
        while (!over(num)) {
            int index = -1;
            for (int i = 0; i < num.length(); i++) {
                if (num.charAt(i) > '0') {
                    index = i;
                    break;
                }
            }
            if (index > -1) {
                //返回值目前还是按照数组类型返回
                res[count++] = Integer.parseInt(num.substring(index));
            }
        }
        return res;
    }
		
	//判断是否溢出,若没有则继续累加
    public static boolean over(StringBuilder sb) {
        boolean over = true;
        //参考题目 【数值+1】
        for (int i = sb.length() - 1; i >= 0; i--) {
            int t = sb.charAt(i) - '0' + 1;
            t = t % 10;
            sb.replace(i, i + 1, String.valueOf(t));
            if (t != 0) {
                over = false;
                break;
            }
        }
        return over;
    }

以上是我的思路,使用字符串累加来实现数值累加打印的效果。 参考其他大佬的思路,可以使用DFS来解答该题目:

public String printNumbers2(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 位
        }
    }


以上是我的全部解答,如有错误,请各位大佬指出,谢谢!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表