面试题十七:打印从1到最大的n位数
输入数字n,按顺序打印到最大的n位数
注意:没有规定类型,无论int或long 都会有可能溢出。
应当选择其他类型如String
方法一:定义长度与位数相同的字符数组,从0开始进行加一操作打印
public static void f1(int n) { char [] array=new char[n]; for(int i=0;i<array.length;i++) { array[i]='0'; } int k=0; while(true) { k=1; for(int i=0;i<array.length;i++) { if(array[i]!='9') {k=0;break;} } PrintNum(array); if(k==1) return ; array=addOne(array); } } //打印字符串,因为前面0不打印 public static void PrintNum(char []ch) { int k=1; for(int i=0;i<ch.length;i++) { if(ch[i]>='1'||k==0) { System.out.print(ch[i]); k=0; } } if(k==0) System.out.println(); } public static char[] addOne(char [] ch) //字符串的加一操作 { ch[ch.length-1]++; for(int i=ch.length-1;i>0;i--) { if(ch[i]<='9') break; ch[i]='0'; ch[i-1]++; } return ch; }
方法二:全排列
static void f2(int n){ if(n<=0) return ; char [] array=new char[n]; for(int i=0;i<10;++i){ array[0]= (char) (i+'0'); Recur( array,1); } } static void Recur(char[] array, int index){ if( index==array.length) { PrintNum( array ); return ;} for( int i=0;i<10;i++){ array[index]= (char) (i+'0'); Recur( array,index+1); } } static void PrintNum(char []ch) { int k=1; for(int i=0;i<ch.length;i++) { if(ch[i]>='1'||k==0) { System.out.print(ch[i]); k=0; } } if(k==0) System.out.println(); }
在java本机测试中方法一在9以内比方法二慢,9以上比方法二快许多
浪波激泥