当前位置: 首页 > news >正文

剑指offer-77、打印从1到最⼤的n位数

题⽬描述

输⼊数字 n ,按顺序打印出从 1 到最⼤的 n 位⼗进制数。⽐如输⼊ 3 ,则打印出 1 、2 、3⼀直到最⼤的 3 位数 999 。

  1. ⽤返回⼀个整数列表来代替打印
  2. n 为正整数

示例1
输⼊:1
返回值:[1,2,3,4,5,6,7,8,9]

思路及解答

直接计算

不太清楚这道题是要考察什么(苦笑),⼏乎都是⼀个循环能解决的事情,仔细想了⼀下,也并没有想到其他⽐较令⼈⽿⽬⼀新的做法,⽤Math.pow(10, n) - 1 取出最⼤的边界条件

public class Solution {public int[] printNumbers(int n) {double len = Math.pow(10, n) - 1;int[] result = new int[(int) len];for (int i = 0; i < len; i++) {result[i] = i + 1;}return result;}
}
  • 时间复杂度:O(10ⁿ),需要生成10ⁿ-1个数字
  • 空间复杂度:O(10ⁿ),需要存储所有数字

当n≥10时,10ⁿ-1会超过int范围,导致溢出

字符串模拟

针对大数问题,使用字符串来模拟数字的生成。

import java.util.ArrayList;
import java.util.List;public class Solution {public int[] printNumbers(int n) {if (n <= 0) return new int[0];// 使用List存储结果,再转为数组List<Integer> list = new ArrayList<>();char[] number = new char[n];  // 存储当前数字的字符表示// 递归生成所有n位数generateNumbers(number, 0, list);// 转换为数组(去掉前导0)int[] result = new int[list.size()];for (int i = 0; i < list.size(); i++) {result[i] = list.get(i);}return result;}private void generateNumbers(char[] number, int index, List<Integer> list) {if (index == number.length) {// 将字符数组转换为整数int num = convertToInt(number);if (num != 0) {  // 跳过0list.add(num);}return;}// 当前位置可以填0-9for (char c = '0'; c <= '9'; c++) {number[index] = c;generateNumbers(number, index + 1, list);}}private int convertToInt(char[] number) {int result = 0;boolean leadingZero = true;for (char c : number) {if (c != '0' || !leadingZero) {if (leadingZero) leadingZero = false;result = result * 10 + (c - '0');}}return result;}
}
  • 时间复杂度:O(n×10ⁿ)
  • 空间复杂度:O(n×10ⁿ)

优化版本:

public class Solution {public int[] printNumbers(int n) {if (n <= 0) return new int[0];int max = (int) Math.pow(10, n) - 1;int[] result = new int[max];// 直接计算并填充,避免字符串转换开销for (int i = 0; i < max; i++) {result[i] = i + 1;}return result;}// 处理大数的版本(返回字符串列表)public String[] printNumbersBig(int n) {if (n <= 0) return new String[0];int max = (int) Math.pow(10, n) - 1;String[] result = new String[max];for (int i = 0; i < max; i++) {result[i] = String.valueOf(i + 1);}return result;}
}

递归回溯

利用递归生成所有可能的数字组合。

import java.util.ArrayList;
import java.util.List;public class Solution {private List<Integer> result;private char[] number;public int[] printNumbers(int n) {if (n <= 0) return new int[0];result = new ArrayList<>();number = new char[n];// 从第0位开始递归生成dfs(0);// 转换为数组int[] arr = new int[result.size()];for (int i = 0; i < result.size(); i++) {arr[i] = result.get(i);}return arr;}private void dfs(int index) {if (index == number.length) {// 将字符数组转换为整数int num = 0;boolean isZero = true;for (int i = 0; i < number.length; i++) {if (number[i] != '0' || !isZero) {if (isZero) isZero = false;num = num * 10 + (number[i] - '0');}}// 跳过0if (num > 0) {result.add(num);}return;}// 当前位置可以填0-9for (char c = '0'; c <= '9'; c++) {number[index] = c;dfs(index + 1);}}
}
  • 时间复杂度:O(10ⁿ)
  • 空间复杂度:O(n) - 递归栈深度
http://www.jsqmd.com/news/410077/

相关文章:

  • 基于 AI 的动态 Payload 生成:实时对抗 WAF 的自学习模型
  • 2026年靠谱的智能仓储/智能仓储系统哪家专业制造厂家实力参考 - 品牌宣传支持者
  • 2026年云南优秀的中医护理,中医正骨,中医理疗馆行业口碑推荐 - 品牌鉴赏师
  • PostgreSQL将异步复制转换成同步复制
  • 杰理之开启KWS语音识别后,来电播放本地铃声出现kws cbuf full以及可能看门狗超时复位【篇】
  • 2026年靠谱的孕妇滋补即食燕窝/即食燕窝帮我推荐几家源头厂家推荐 - 品牌宣传支持者
  • 2026年通州狗狗寄养哪家好?通州专业正规的狗狗寄养基地名单 - 品牌2025
  • 杰理之在线调试工具串口打开失败修改说明【篇】
  • 互联网大厂Java求职面试实战:核心技术栈与场景深度解析
  • 2026年比较好的余热/窑炉余热回收选哪家高口碑品牌参考 - 品牌宣传支持者
  • 2026年比较好的广东专业扩声系统/广东厅堂声光电系统推荐几家可靠供应商参考 - 品牌宣传支持者
  • 杰理之EQ文件更新问题-【篇】
  • 第10章 AIGC深度探索:插件生态与数据分析能力进阶
  • 2026年知名的2-羟基-2-甲基丙腈,丙酮氰醇99%,丙醇氰醇桶装厂家采购指南及推荐 - 品牌鉴赏师
  • 2026年评价高的东莞至上饶物流专线/东莞至抚州物流专线用户好评推荐公司 - 品牌宣传支持者
  • EXCEL目录那些事
  • 不用HslCommunication!C#手写轻量级Modbus TCP上位机,适配90%工业设备
  • 2026年比较好的南通清便护理机器人/二便护理机器人好评厂家曝光 - 品牌宣传支持者
  • 2026年口碑好的大连考研专业课/大连考研辅导综合推荐公司 - 品牌宣传支持者
  • 深入剖析Ghost:Gh0st RAT恶意软件分析
  • 2000-2024年上市公司环保补助数据+Stata代码
  • 2026年优秀的风电变压器,光伏变压器厂家采购选型榜单 - 品牌鉴赏师
  • 2026年比较好的大连考公省考/大连考公集训营综合评价推荐机构 - 品牌宣传支持者
  • 从0到1落地新能源质检上位机:C#工业级开发实战笔记
  • 零API成本!JS生态免费大模型聚合工具全解析:一次提问,多模型同时回复
  • 2026年口碑好的西安新中式红木家具/西安国标红木家具厂家选择指南怎么选(真实参考) - 品牌宣传支持者
  • 2026年热门的仓储模具架/宁波重型模具架厂家推荐清单 - 品牌宣传支持者
  • 朝阳宠物寄养哪家好?朝阳宠物寄养哪家比较专业正规 - 品牌2025
  • 2026年口碑好的混合乳化泵/宁波多级乳化泵厂家实力参考 - 品牌宣传支持者
  • 新手必看:C#上位机从0到1,快速实现Modbus TCP与PLC通信