《剑指offer第二版》面试题17:打印从1到最大的n位数(ja

2020-03-23  本文已影响0人  castlet

题目描述

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

解题思路:

  1. 题目并没有限定n的大小,因此需要考虑大数问题。
  2. 可以通过字符串模拟数字的加法。
  3. 打印字符串。

代码

void printToMaxNDigits(int n){
    if (n <= 0) {
        return;
    }
    char[] numbers = new char[n];
    for (int i = 0; i < numbers.length; i++) {
        // 每一位都设置为'0'
        numbers[i] = '0';
    }
    while (increase(numbers)) {
        // 增加字符串大小,并打印
        printNumber(numbers);
        System.out.print(" ");
    }
}

/**
 * 用字符串模拟数字的加法
 * @param number 字符串
 * @return 是否到达字符串的最大值
 */
boolean increase(char[] number){
    if (number == null || number.length <= 0) {
        return false;
    }
    int carry = 1;
    int i = number.length - 1;
    while ( carry > 0 && i >= 0) {
        int firstNumber = number[i] - '0';
        int result = firstNumber + carry;
        if (result >= 10) {
            number[i] = Character.forDigit(result % 10, 10);
            carry = 1;
        } else {
            number[i] = Character.forDigit(result, 10);
            carry = 0;
        }
        i--;
    }
    if (i < 0 && carry > 0) {
        return false;
    }
    return true;
}

/**
 * 打印字符串
 * @param number
 */
void printNumber(char[] number){
    if (number == null || number.length <= 0) {
        return;
    }
    int length = number.length;
    boolean flag = false;
    for (int i = 0; i < number.length; i++) {
        if (i == number.length - 1) {
            System.out.print(number[i]);
            break;
        }
        if (!flag) {
            flag = !(number[i] == '0');
        }
        if (flag) {
            System.out.print(number[i]);
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读