【剑指offer】面试题17:打印从1到最大的n位数
来源:互联网 发布:如何查询网络统考成绩 编辑:程序博客网 时间:2024/06/05 08:29
完整代码地址
完整代码地址
题目
输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数999。
思路
解法1
例如输入数字3
可以当成排列如下数字:
000
001
002
…
997
998
999
即打印出数字的全排列。
所以可以递归求解
解法2
递增,每次在最低位+1,然后处理出现数字10的情况
这里有一个点要注意,怎么判断打印结束,有两种做法:
1.用字符串比较算法,和”999…99”即最大的数比较,这样时间复杂度为O(n),不可取
2.判断最高位是否发生了进位,时间复杂度为O(1),我使用这种方法
代码(解法1)
public static void Print1ToMaxOfNDigits_1(int n) { if(n <= 0) return; char[] digits = new char[n]; Print1ToMaxOfNDigits_1(digits, n-1);}/** * 递归,实现全排列 */private static void Print1ToMaxOfNDigits_1(char[] digits, int index) { if(index == -1) { PrintDigit(digits); return; } for(int i = 0; i < 10; ++i) { digits[index] = (char) ('0' + i); Print1ToMaxOfNDigits_1(digits, index-1); }}/** * 打印digits,注意开头不要打印0 */private static void PrintDigit(char[] digits) { boolean zeroFlag = true; for(int i = digits.length-1; i >= 0; --i) { if(digits[i] == '0' && zeroFlag) continue; System.out.print(digits[i]); zeroFlag = false; } if(zeroFlag == false) { System.out.print(' '); }}
解法2
public static void Print1ToMaxOfNDigits_2(int n) { if(n <= 0) return; char[] digits = new char[n]; for(int i = 0; i < digits.length; ++i) { digits[i] = '0'; } while(Increment(digits)) { PrintDigit(digits); }}/** * 递增 */private static boolean Increment(char[] digits) { digits[0] += 1; for(int i = 0; i < digits.length; ++i) { int num = digits[i] - '0'; if(num == 10) { if(i == digits.length-1) { return false; } digits[i+1] += 1; digits[i] = '0'; } else { break; } } return true;}/** * 打印digits,注意开头不要打印0 */private static void PrintDigit(char[] digits) { boolean zeroFlag = true; for(int i = digits.length-1; i >= 0; --i) { if(digits[i] == '0' && zeroFlag) continue; System.out.print(digits[i]); zeroFlag = false; } System.out.print(' ');}
测试
public static void main(String[] args) { test1(); test2();}private static void test1() { _17_Print1ToMaxOfNDigits.Print1ToMaxOfNDigits_1(1); System.out.println(); _17_Print1ToMaxOfNDigits.Print1ToMaxOfNDigits_1(2); System.out.println(); _17_Print1ToMaxOfNDigits.Print1ToMaxOfNDigits_1(3); System.out.println(); System.out.println();}private static void test2() { _17_Print1ToMaxOfNDigits.Print1ToMaxOfNDigits_1(0); System.out.println(); _17_Print1ToMaxOfNDigits.Print1ToMaxOfNDigits_1(-1); System.out.println();}
阅读全文
0 0
- 剑指offer--面试题17:打印从1到最大的n位数
- 【剑指offer】面试题17:打印从1到最大的n位数
- 《剑指offer》面试题17:打印从1到最大的n位数
- 剑指Offer 面试题17:打印从1到最大的n位数 Java代码实现
- 剑指Offer(第二版)面试题17:打印从1到最大的n位数
- offer面试题----打印1到最大的n位数
- 剑指offer面试题12:打印1到最大的n位数(1)
- 剑指offer 面试题12 打印1到最大的N位数
- [剑指offer][面试题12]打印1到最大的n位数
- 【剑指offer】面试题12:打印1到最大的n位数
- 剑指Offer:面试题12 打印1到最大的n位数
- 《剑指Offer》面试题12:打印1到最大的n位数
- 剑指offer 面试题12—打印1到最大的n位数
- 【剑指Offer学习】【面试题12 :打印1 到最大的n 位数】
- 《剑指Offer》学习笔记--面试题12:打印1到最大的n位数
- 剑指offer--面试题12:打印1到最大的n位数--Java实现
- 【剑指Offer面试题】 九度OJ1515:打印1到最大的N位数
- 剑指Offer面试题12(Java版):打印1到最大的n位数
- 序
- how about postman??
- 欢迎使用CSDN-markdown编辑器
- hadoop初探
- keil5烧录或下载程序出现停止工作的问题
- 【剑指offer】面试题17:打印从1到最大的n位数
- 【SVN】中检出(check out) 和导出(export) 的区别
- 如何理解spring
- 删除文件夹下的所有文件和子文件夹
- I/O多路复用之epoll
- 用python socket发送rsyslog日志
- SPOJ VLATTICE Visible Lattice Points 莫比乌兹反演入门题
- git版本回退
- [python]解析通达信盘后数据获取历史日线数据