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

网站首页 > 资源文章 正文

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

qiguaw 2024-11-24 20:41:14 资源文章 13 ℃ 0 评论

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


思路

这道题难度并不大,但是要注意大数越界的问题

最大的 n 位数(记为 end )和位数 n 的关系: 例如最大的 1 位数是 9 ,最大的 2 位数是 99 ,最大的 3 位数是 999 。则可推出公式:end = 10^n - 1

大数越界问题: 当 n 较大时,end 会超出 int32 整型的取值范围,超出取值范围的数字无法正常存储。但由于本题要求返回 int 类型数组,相当于默认所有数字都在 int32 整型取值范围内,因此不考虑大数越界问题。




如果需要考虑大数问题:

1. 表示大数的变量类型:

无论是 short / int / long ... 任意变量类型,数字的取值范围都是有限的。因此,大数的表示应用字符串 String 类型。

2. 生成数字的字符串集:

使用 int 类型时,每轮可通过 +1 生成下个数字,而此方法无法应用至 String 类型。并且, String 类型的数字的进位操作效率较低,例如 "9999" 至 "10000" 需要从个位到千位循环判断,进位 4 次。

观察可知,生成的列表实际上是 n 位 0 - 9 的 全排列 ,因此可避开进位操作,通过递归生成数字的 String 列表。

3. 递归生成全排列:

基于分治算法的思想,先固定高位,向低位递归,当个位已被固定时,添加数字的字符串。例如当 n = 2 时(数字范围 1?99 ),固定十位为 0 - 9 ,按顺序依次开启递归,固定个位 0 - 9 ,终止递归并添加数字字符串。




来源:力扣(LeetCode)

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

欢迎 发表评论:

最近发表
标签列表