【刷题记录】25.打印从1到最大的n位数

137 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

题目来源:LeetCode>打印从1到最大的n位数

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

示例 1:

输入: n = 1

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

说明:

用返回一个整数列表来代替打印

n 为正整数

二、思路分析:

思路一:

  1. 大体思路:一般的普通解法,这题考查的实际是大数问题
  2. 枚举

思路二:

  1. 大体思路:全排列解法
  2. 在数字很大的情况下,哪怕long类型也无法承载,那必须要用字符串保存。
  3. 本题其实是对数字09的全排列,从1位数09的全排列到n位数0~9的全排列,其中要注意的是数字开头不应该有0。
  4. 为了避免数字开头出现0,先把首位first固定,first取值范围为1~9
  5. 用digit表示要生成的数字的位数,本题要从1位数一直生成到n位数,对每种数字的位数都生成一下首位,所以有个双重for循环
  6. 生成首位之后进入递归生成剩下的digit - 1位数,从0~9中取值
  7. 递归的中止条件为已经生成了digit位的数字,即index == digit,将此时的数num转为int加到结果result中

三、AC 代码:

思路一:


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

思路二:

    class Solution {
        int[] result;
        int count = 0;

        public int[] printNumbers(int n) {
            result = new int[(int) Math.pow(10, n) - 1];
            for (int digit = 1; digit < n + 1; digit++) {
                for (char first = '1'; first <= '9'; first++) {
                    char[] number = new char[digit];
                    number[0] = first;
                    dfs(1, number, digit);
                }
            }
            return result;
        }

        private void dfs(int index, char[] num, int digit) {
            if (index == digit) {
                result[count++] = Integer.parseInt(String.valueOf(num));
                return;
            }
            for (char i = '0'; i <= '9'; i++) {
                num[index] = i;
                dfs(index + 1, num, digit);
            }
        }
    }

四、总结:

全排列简单说明:

比如对于数字1,2,3的全排列是:

123, 132, 213, 231, 312, 321

为了能够测试通过,最后把字符串形式变成了int形式,其实应该返回字符串数组