面试题17:打印从1到最大的n位数
题目描述:
输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999
【注意】:n的范围,当n超过long long的范围时,应该如何处理——大数
方法一:
用字符串或者数组的方式来表达大数
方法二:
转换为数字排列的解法,用递归来解决问题
如果在数字前面补0,则n位所有十进制数其实是n个从0~9的全排列——把数字的每一位都从0~9排列编,就得到了所有的十进制数,在打印时,在数字前面的0不做打印
用【递归】来表示全排列,数字的每一位都可能是0~9中的一个数,然后设置下一位
import java.util.Scanner;
public class Q17 {
public static void main(String[] args) {
System.out.println("your input:");
int n = 0;
Scanner scanner = new Scanner(System.in);
if(scanner.hasNextInt()==true) {
n = scanner.nextInt();
}
if(n<=0) {
System.out.println("wrong input");
}else {
show1toN(n);
}
}
public static void show1toN(int n) {
//初始化stringbuffer
StringBuffer sb = new StringBuffer(n);
for(int i=0;i<n;i++) {
sb.append('0');
}
// 打印
getNthNumber(n, sb, 0);
}
public static void getNthNumber(int n, StringBuffer sb,int index) {
// sb是共享的,所以当index=n时,表示最后一位(n-1)已经排列完成,可以打印sb
// 相当于n层循环
// 对sb的第index-1位进行排列
if(index == n) {
showNumber(sb.toString());
}else {
for(int i=0;i<10;i++) {
sb.setCharAt(index, (char) ((char) i+'0'));
getNthNumber(n, sb, index+1);
}
}
}
// 打印数字,如果前面是0则不打印0
public static void showNumber(String str) {
int flag = 0;
for(int i=0;i<str.length();i++) {
if(str.charAt(i)=='0') {
if(flag!=0) {
System.out.print(str.charAt(i));
}
}else {
flag=1;
System.out.print(str.charAt(i));
}
}
System.out.println();
}
}