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

剑指 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]

说明:

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

解法一:回溯

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
func printNumbers(n int) []int {
    chs := make([]byte, n)
    var ans []int
    var backtracking func(idx int)
    backtracking = func(idx int) {
        if idx == n {
            num, _ := strconv.Atoi(string(chs))
            ans = append(ans, num)
            return
        }
        for i := 0; i <= 9; i++ {
            chs[idx] = byte(i + '0')
            backtracking(idx + 1)
        }
    }
    backtracking(0)
    ans = ans[1:]
    return ans
}

另一种代码实现:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
    StringBuilder res;
    int nine = 0, count = 0, start, n;
    char[] num, loop = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
    public String printNumbers(int n) {
        this.n = n;
        res = new StringBuilder();
        num = new char[n];
        start = n - 1;
        dfs(0);
        res.deleteCharAt(res.length() - 1);
        return res.toString();
    }
    void dfs(int x) {
        if(x == n) {
            String s = String.valueOf(num).substring(start);
            if(!s.equals("0")) res.append(s + ",");
            if(n - start == nine) start--;
            return;
        }
        for(char i : loop) {
            if(i == '9') nine++;
            num[x] = i;
            dfs(x + 1);
        }
        nine--;
    }
}
Licensed under CC BY-NC-SA 4.0
最后更新于 2023/06/20 18:50:45
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计