面试题12:打印1到最大的n位数

题目:

  输入数字n,按顺序打印出从1到最大的n位十进制数。
比如输入3,则打印出1,2,3,... ,一直到最大的3位数即 999.

 

题目的陷阱:

  当输入的n很大时,此时就是一个大数问题。

 

解决方案:

  在数组或者字符串上模拟数字加法的解法,绕过陷阱

 

Java代码:

 1 package com.hb;

 2 

 3 import java.util.ArrayList;

 4 import java.util.Iterator;

 5 

 6 public class Print1ToMaxOfNDigits {

 7     public void Print1ToMaxofNDigits(int n){

 8         //用nlist表示数n,nlist[0]表示n的最高位 ------注意,看别人程序时,有可能有的地方不是对的,还是要有自己的思想

 9         ArrayList<Integer> nlist = new ArrayList<Integer>();

10         for(int i = 0 ; i < n ; i++){

11             nlist.add(0);  //将元素添加到列表的尾部

12         }

13     

14         increment(nlist);    

15     }

16         

17     //用数组模拟数字+1

18     public static void increment(ArrayList<Integer> nlist){

19         int carrybit = 0 ;   //carrybit是进位的意思

20         boolean end = false ;

21         while(true){

22             

23             for(int i = nlist.size() - 1 ;  i >= 0 ; i--){

24                 int digit = nlist.get(i);

25                 int sum = digit + carrybit ;    //从个位开始,加1

26                 if(i == (nlist.size() - 1)){

27                     sum += 1 ;  //sum++

28                 }

29                 if(sum >= 10){

30                     //最高位产生进位,达到最大值,停止输出

31                     if(i == 0 ){

32                         end = true;

33                     }

34                     sum = sum - 10;

35                     carrybit = 1 ;

36                 }else{

37                     carrybit = 0 ;

38                 }

39                 

40                 nlist.set(i, sum);    

41             }  //for循环结束        

42             

43             output(nlist);            

44             if(end) {break;    }            

45         }

46     }

47         

48     //输出数字,将高位的 0 舍掉

49     public static void output(ArrayList<Integer>  nlist){

50         Iterator<Integer> ite = nlist.iterator();

51         int num;

52         //找到第一个为 0 的位置

53         boolean first = false ;

54         

55         while (ite.hasNext()){

56             if(first){

57                 System.out.print("--" + ite.next());

58                 continue;

59             }

60             if((num = ite.next()) != 0){

61                 first = true ;

62                 System.out.print("+++"+num);

63             }

64         }        

65         System.out.println();        

66     }

67     

68     public static void main(String[] args) {

69         Print1ToMaxOfNDigits  p = new Print1ToMaxOfNDigits();

70         int n = 2;

71         p.Print1ToMaxofNDigits(n);

72     }

73     

74     

75 

76 }
View Code

 

 

 转载:http://www.2cto.com/kf/201311/256909.html

  

你可能感兴趣的:(面试题)