剑指offer2之打印从1到最大的n位数

前言

如果面试题是关于 n 为的整数并且没有限定 n 的取值范围,或者输入任意大小的整数,那么可能需要考虑大数问题。而字符串是一种简单、有效地表示大数的方法。

题目(打印从 1 到最大的 n 位数)

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

算法思路

本题没有给定 n 的范围,因此需要考虑大数问题。

算法思路一(字符串模拟)

用字符串表示数字的时候,最直观的方法就是字符串里每个字符都是 ‘0’-‘9’ 之间的某一个字符,用来表示数字中的任一位。因为数字最大是 n 位的,因此我们需要一个长度为 n+1 的字符串(字符串中最后一位是结束符号 ‘\0’)。并且将字符串的每一位初始化为 ‘0’,但要注意的是,最后打印的时候,前半部分的 0 需要过滤掉。

接下来,我们就对字符串的最后一位一直加 1 ,然后再判断是否需要进位,如果需要进位,那么就需要把字符串最后一位变为 ‘0’,而前一位的字符也要跟着加 1,然后继续判断是否需要继续进位,一直到直接加 1,不需要进位,或者遇到了最大的 n 位数退出外层循环。

算法思路二(递归法)

将问题转换成按数字排列,也就是所对于字符串的每一位都可以有 10 种选择—-‘0’-‘9’。也就是说,我们把数字的每一位都从 0 到 9 依次排列一遍,就得到所有的十进制数。最后打印的时候只要从第一个非 0 的字符开始打印即可。

算法实现

字符串模拟

递归法

复杂度分析

算法一的时间消耗主要在 while 循环上,由于需要打印出从 1 到最大的 n 位数,因此若设这些数共有 m 个,那么时间复杂度为 O(m);而算法二采用递归思想,时间复杂度也为 O(m),差不多共有 10^n 个组合。空间复杂度都为 O(n)。

参考

<<剑指offer2>>

-------------本文结束感谢您的阅读-------------