• 面试题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

      

  • 相关阅读:
    zoj 1671 Walking Ant【简单bfs】
    hdoj 2717 Catch That Cow【bfs】
    hdoj 1010 Tempter of the Bone【dfs查找能否在规定步数时从起点到达终点】【奇偶剪枝】
    poj 1321 棋盘问题【dfs】
    [LC] 124. Binary Tree Maximum Path Sum
    [LC] 113. Path Sum II
    [LC] 112. Path Sum
    [LC] 98. Validate Binary Search Tree
    [LC] 39. Combination Sum
    [LC] 159. Longest Substring with At Most Two Distinct Characters
  • 原文地址:https://www.cnblogs.com/Mokaffe/p/4337134.html
Copyright © 2020-2023  润新知