CS-Wiki CS-Wiki
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
  • 刷题模板汇总
  • 一些刷题小技巧
  • 整数 and 位运算

  • 数组

  • 链表

  • 哈希表

  • 字符串

  • 栈

  • 队列

  • 二叉树

  • 前缀树

  • 二分查找

  • 双指针法

  • 区间求和问题

  • 排序

  • 回溯算法

  • 贪心算法

  • 动态规划

  • 图

    • 图理论基础
    • 图的搜索:DFS

      • 岛屿的最大面积:BFS 和 DFS 模板
      • 岛屿数量
      • 节点间通路
      • 二分图
      • 所有路径:需要存储路径的 DFS 模板
      • 单词搜索:DFS + 回溯模板
      • 计算除法
      • 最长递增路径:记忆化 DFS 模板
      • 二叉树中所有距离为 K 的结点
      • 克隆图
      • 剑指 Offer 17 - 打印从 1 到最大的 n 位数
        • 📃 题目描述
        • 🔔 解题思路
          • 小数问题
          • 大数问题,DFS
        • 💥 复杂度分析
      • 剑指 Offer 35 - 复杂链表的复制
      • 展平多级双向链表
    • 图的搜索:BFS

    • 拓扑排序

    • 并查集

  • 数学

  • 自动机

  • 海量数据和空间限制

  • 05-数据结构与算法
  • 图
  • 图的搜索:DFS
小牛肉
2022-09-29
目录

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

# 📃 题目描述

题目链接:剑指 Offer 17. 打印从1到最大的n位数 (opens new window)

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

示例 1:

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

# 🔔 解题思路

# 小数问题

class Solution {
    public int[] printNumbers(int n) {
        int end = 9;
        while (n != 1) {
            end = end * 10 + 9;
            n --;
        }

        List<Integer> list = new ArrayList<>();
        for (int i = 1; i <= end; i ++) {
            list.add(i);
        }

        return list.stream().mapToInt(Integer::intValue).toArray();
    }
}

# 大数问题,DFS

参考链接:https://leetcode.cn/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/solution/jian-zhi-offer-17-da-yin-cong-1dao-zui-d-ngm4/

在数字很大的情况下,哪怕 long 类型也无法承载,那必须要用字符串保存。

对于本题其实就是对数字 0 ~ 9 的全排列,从 1 位数 0 ~ 9 的全排列到 n 位数 0~9 的全排列,其中要注意的是数字开头不应该有 0。

以下是具体步骤

  • 为了避免数字开头出现 0,先把首位 first 固定,first 取值范围为1~9
  • 用digit表示要生成的数字的位数,本题要从1位数一直生成到n位数,对每种数字的位数都生成一下首位,所以有个双重for循环
  • 生成首位之后进入递归生成剩下的 digit - 1 位数,从 0~9 中取值
  • 递归的中止条件为已经生成了 digit 位的数字,即 index == digit,将此时的数num转为int加到结果res中
class Solution {
    public int[] printNumbers(int n) {
        List<Integer> list = new ArrayList<>();

        // 构造 digit 位数的全排列
        for (int digit = 1; digit <= n; digit ++) {
            // 固定第一位(把第一位单独拉出来的原因是,第一位不能为 0)
            for (char first = '1'; first <= '9'; first ++) {
                char[] temp = new char[digit];
                temp[0] = first;

                // 生成首位之后进入递归生成剩下的 digit - 1 位数,从 0~9 中取值
                // 从下标 index 位开始往后递归选取
                int index = 1;
                dfs(index, digit, temp, list);
            }
        }

        return list.stream().mapToInt(Integer::intValue).toArray();
    }

    private void dfs(int index, int digit, char[] temp, List<Integer> list) {
        if (index == digit) {
            list.add(Integer.parseInt(String.valueOf(temp)));
            return ;
        }

        for (char i = '0'; i <= '9'; i ++) {
            // 将下标为 index 位设为 i
            temp[index] = i;
            // 递归设置下标 index + 1 位
            dfs(index + 1, digit, temp, list);
        }
    }
}

# 💥 复杂度分析

  • 空间复杂度:
  • 时间复杂度:

🎁 公众号

各位小伙伴大家好呀,叫我小牛肉就行,目前在读东南大学硕士,上方扫码关注公众号「飞天小牛肉」,与你分享我的成长历程与技术感悟~

帮助小牛肉改善此页面 (opens new window)
Last Updated: 2023/02/16, 11:27:10
克隆图
剑指 Offer 35 - 复杂链表的复制

← 克隆图 剑指 Offer 35 - 复杂链表的复制→

最近更新
01
02
线上环境 CPU 使用率飙升如何快速排查?
03-05
03
面试官再跟你说中国没有根服务器,雪人计划让他了解下
02-23
更多文章>
Theme by Vdoing | Copyright © 2019-2023 飞天小牛肉 | 皖ICP备2022008966号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式