本文主要是介绍面试题12. 打印1到最大的n位数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述:
输入数字n,按顺序打印从1到最大的n位十进制数,比如输入3,打印出1、2、3 … 999。
思路1,用加法:
如果n很小,那么完全可以用(长)整型来实现。
public static void print(int n) {int num = 1;while(n-- > 0) {num *= 10;}for(int i = 1; i < num; i++) {System.out.println(i);}
}
如果n很大很大,必须用字符串来模拟数字。
- 首先,初始化一个长度为n的字符串,并把字符串上的每一位全部初始化为’0’
- 然后模拟字符串加法,每次都加1,并打印出来。
模拟字符串加法,请见美团面试题:http://blog.csdn.net/u010429424/article/details/77407973
思路2,用字符的全排列:
对于n位数字,每一位数字都从 0 ~ 9 之间取值,n位数字就是n个全排列。
我们把这些全排列写出来,然后打印出来就行了。
注意,不要打印出前几位的0。
全排列的核心代码如下:
static char[] arr = {'0','1','2','3','4','5','6','7','8','9'};public static void solution2(int n) {char[] num = new char[n];for(int i = 0; i < 10; i++) {num[0] = arr[i];core(num, 0); // 开始递归}
}public static void core(char[] num, int index) {if(index == num.length-1) {print(num);return ;}for(int i = 0; i < 10; i++) {num[index + 1] = arr[i];core(num, index + 1);}
}
最后,给出全部的代码:
/*** description:打印1到n的数字* 方法1. 用int* 方法2. 字符串模拟加法* 方法3. 全排列* @author lijialin**/public class Main {// 方法1,当n很小时,使用int表示数字public static void solution1(int n) {int num = 1;while(n-- > 0) {num *= 10;}for(int i = 1; i < num; i++) {System.out.println(i);}}// 方法3, 当n放大时,int表示不下,用全排列static char[] arr = {'0','1','2','3','4','5','6','7','8','9'};public static void solution2(int n) {char[] num = new char[n];for(int i = 0; i < 10; i++) {num[0] = arr[i];core(num, 0); // 开始递归}}public static void core(char[] num, int index) {if(index == num.length-1) {print(num);return ;}for(int i = 0; i < 10; i++) {num[index + 1] = arr[i];core(num, index + 1);}}public static void print(char[] num) {boolean isBeginning = true;for(int i = 0; i < num.length; i++) {if(isBeginning && num[i] != '0') {isBeginning = false;}if(!isBeginning) {System.out.print(num[i]);}}System.out.println();}// mainpublic static void main(String[] args) {// test case 1int n = 3;solution1(n);solution2(n);}
}
注:学渣心里苦,不要学楼主,平时不努力,考试二百五,哭 ~
这篇关于面试题12. 打印1到最大的n位数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!