刷leetcode《剑指offer》第十六题"打印从1到最大的n位十进制数",有感
题目
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。 比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
输入: n = 1 输出: [1,2,3,4,5,6,7,8,9]
解析
- 因为题目要求返回值为整型数组,那就默认不会有大数溢出情况,那就直接循环。
- 但是这道题,一般会考虑整数溢出的问题。所以使用字符来代替整形。

注意
- 在考虑大数溢出的情况下,要考虑每个数字左边的零个数,要去掉
- 使用分治法以及全排列。
具体代码实现
第一种方法
class Solution {
public int[] printNumbers(int n) {
int m = (int) Math.pow(10,n);
int[] arr = new int[m-1];
for (int i = 0; i < m-1; i++) {
arr[i] = i+1;
}
return arr;
}
} 第二种方法
// 考虑大数
public void printNumbers1(int n) {
StringBuilder str = new StringBuilder();
// 将str初始化为n个0的字符串
for (int i = 0; i < n; i++) {
str.append('0');
}
// 判断去掉左侧的0
while (!increment(str)) {
// 去掉左侧的0
int index = 0;
while (index < str.length() && str.charAt(index) == '0') {
index++;
}
System.out.println(str.toString().substring(index));
}
}
/**
* 判断是否溢出
*
* @param str 字符串
* @return 返回判断值
*/
private boolean increment(StringBuilder str) {
boolean isOverflow = false;
for (int i = str.length() - 1; i >= 0; i--) {
char s = (char) (str.charAt(i) + 1);
// 如果s> '9'则发生进位
if (s > '9') {
// 将'9'变为'0'
str.replace(i, i + 1, "0");
if (i == 0) {
isOverflow = true;
}
} else {
// 没有发生进位
str.replace(i, i + 1, String.valueOf(s));
break;
}
}
return isOverflow;
} 
京公网安备 11010502036488号