码迷,mamicode.com
首页 > 其他好文 > 详细

剑指offer(5.2)

时间:2020-05-30 19:50:49      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:依次   str   incr   bsp   描述   补充   +=   输出   题目   

题目描述——给定一个数字N,打印从1到最大的N位数。

输入

每个输入文件仅包含一组测试样例。

对于每个测试案例,输入一个数字N(1<=N<=5)。 输出 对应每个测试案例,依次打印从1到最大的N位数。

样例输入

1

样例输出

1 2 3 4 5 6 7 8 9

——————————最先想到的就是,10^n 啊 ————————————

public int print(int n){

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

    System.out.println(i);

  }

}

但是呢,考虑一个问题。溢出

int类型是要溢出的呀,如果n太大

字符串,数组是大数的最佳存储方法

其实,从1打印到N位最大数,就是一个递归+1的过程。

用字符串模拟加法,一个字符代表一位,每个位循环输出0-9,遇10进1

想象所有数字都是N位的,1就相当于前面N-1位都为0,没有打印出来。

于是,这个递归的过程就开始清晰了

加法的过程是:1)初始化字符串为全0  2)末位加1,查看最末位是否有进位,检查溢出,如果大于等于10则产生进位,当前位减10;没有进位则结束  3)从后往前循环:往前移一位,查看是否有进位,是否溢出;遇到没有进位则结束循环。  4)打印字符串。第一个非0位之前的0全部不打印

 public void solution(int n){

  if(n < 0)  System.out.println("n cannot be negative!");

  char num[] = new char[n];

  for(int i = 0; i < num.lenght; ++i){

    num[i] = ‘0‘;

  }

  while(!increment(num)){

    Print(num);

  }

}

public boolean increment(char num){

  boolean isOverflow = false;

  int takeOver = 0;    //进位

  int sum = 0;

  for(int i = num.length-1; i >=0; i--){

    sum = num[i] - ‘0‘ + takeOver;

    if(i == num.length-1)  sum += 1;

    if(sum >= 10){

      if(i = 0){ 

        isOverflow = true;

      }else{

        sum -=10;

        overTake = 1;

        num[i] = sum + ‘0‘;

    }else{

      num[i] = sum + ‘0‘;

      break;

    }

  return isOverflow;

}

public void Print(char num){         //遇见第一个非0位才开始打印

  boolean isBeginning0 = true;          //true = 当前位字符是补充的0,无需打印

  for(int i = 0; i< num.length-1; i++){       //从字符串第一位开始打印(最高位)

    if(isBeginning && num[i] != ‘0‘){     //如果num当前位非0 或 当前位是0但不是补充的0,则接下来的所有位都可以打印,于是置isBeginning0为false

      isBeginning0 = false;

    }

    if( !isBeginning0){

      System.out.print(num[i]);

    }

  }

}

剑指offer(5.2)

标签:依次   str   incr   bsp   描述   补充   +=   输出   题目   

原文地址:https://www.cnblogs.com/cherry-BAIL/p/12969699.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!