《剑指offer第二版》面试题17:打印从1到最大的n位数(ja
2020-03-23 本文已影响0人
castlet
题目描述
输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1,2,3直到999。
解题思路:
- 题目并没有限定n的大小,因此需要考虑大数问题。
- 可以通过字符串模拟数字的加法。
- 打印字符串。
代码
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]);
}
}
}