[剑指Offer]打印1到最大的n位数
来源:互联网 发布:遇到网络诈骗怎么半 编辑:程序博客网 时间:2024/05/16 09:05
题目描述
输入数字n,按顺序打印出从1到最大的n位十进制数。
陷阱:n非常大的时候,int、long均不好使。
解题思路
思路一:
我们可以模拟加法来打印。需要注意的是进位问题和是否已经到达最大的n位十进制数。
思路二:
采用递归的解法。数字的每一位都可能是0-9中的一个数,然后设置下一位,递归结束的条件是我们设置数字的最后一位。
代码
模拟加法实现
/** * 模拟加法来顺序打印1到最大的n位数 * @param n */public static void print1ToMaxOfNDigitsByAnalogAddition(int n) {if (n <= 0)return;byte[] num = new byte[n];boolean flag = true;//标记是否已经是最大的n位数int takeOver = 0;// 进位符Arrays.fill(num, (byte) 0);while (flag) {takeOver = 0;// 进位符归0for (int i = n - 1; i >= 0; i--) {int temp = (num[i] - (byte) 0) + takeOver;// 计算当前位的值if (i == n - 1) {temp++;// 如果是最末位则自增}if (temp >= 10) {// 当前位大于10if (i == 0) {// 如果第0位已经大于10,则将变为n+1位flag = false;} else {temp -= 10;takeOver = 1;num[i] = (byte) temp;}} else {// 如果没有进位,则结束num[i] = (byte) temp;break;}}if (flag) {//打印数组int i = 0;while (i < n && num[i] == (byte) 0) {i++;}while (i < n) {System.out.print(num[i] - (byte) 0);i++;}System.out.println("");}}}
递归实现
/** * 递归来顺序打印1到最大的n位数 * @param n */public static void print1ToMaxOfNDigitsByRecursive(int n) {if (n <= 0)return;byte[] num = new byte[n];for (int i = 0; i < 10; i++) {num[0] = (byte) i;print1ToMaxOfNDigitsRecursively(num, 0);}}public static void print1ToMaxOfNDigitsRecursively(byte[] num, int index) {if (index == num.length - 1) {//打印数组int i = 0;while (i < num.length && num[i] == (byte) 0) {i++;}while (i < num.length) {System.out.print(num[i] - (byte) 0);i++;}System.out.println("");return;}for (int i = 0; i < 10; i++) {num[index + 1] = (byte) i;print1ToMaxOfNDigitsRecursively(num, index + 1);}}
0 0
- 剑指Offer之打印1到最大的N位数
- 剑指offer:打印1到最大的n位数
- 【剑指offer】打印1到最大的n位数
- [剑指Offer]打印1到最大的n位数
- 【剑指offer】打印1到最大的n位数
- 剑指Offer之打印1到最大的n位数
- 剑指Offer之 - 打印1到最大的n位数
- 剑指offer-12 打印1到最大的N位数
- 剑指offer 12 -打印1到最大的n位数
- 剑指offer:打印1到最大的n位数
- 剑指Offer-12-打印1到最大的n位数
- [剑指offer-1515]打印1到最大的N位数
- 剑指offer 打印1到最大的N位数
- 剑指Offer--012-打印1到最大的N位数
- 剑指Offer 打印1到最大的n位数
- 剑指Offer:打印1到最大的N位数
- 《剑指offer》:[16]打印1到最大的N位数
- 【剑指offer】打印1到最大的n位数
- localtime和gmtime的区别
- 函数与存储过程
- Android 使用ContentProvider扫面手机图片是过滤小尺寸图片,图片排序
- [RAC性能调优] gc buffer busy acquire 处理
- C#构造函数与折构函数
- [剑指Offer]打印1到最大的n位数
- 多表查询
- Z-Stack Monitor and Test(MT)与Z-tool介绍
- 2、从头学Android之第一个Activity程序
- Android相关网站
- 简单的哈希表实现
- RMAN备份详解
- android 控件 按钮(Button)
- Java多线程同步——生产者消费者问题