题目要求:输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999
解题思路:
1.首先暴力法遍历可以求解,但是大整数问题需要另一种思路
2.构建一个StringBuilder字符串,输入的n为多少,就赋多少个0。
3.当该字符串没有发生位数溢出的时候,循环打印
4.首先从最小位数开始累加,最开始为’0’,每次循环+1,一直到’9’
5.当该位为’9’的时候,再+1发生进位,则将该位变为0(StringBuilder的replace函数),然后for循环对它下一位数加1。
6.若当前位没有发生进位,则跳出循环到外部方法中打印。
public class Solution {
boolean isOverflow = false;
public int[] printNumbers(int n) {
ArrayList<Integer> arrayList=new ArrayList<Integer>();
// 将str初始化为n个'0'字符组成的字符串
StringBuilder str = new StringBuilder();
for(int i=0;i<n;i++){
str.append("0");
}
//调用一个累加函数对位数进行累加,当位数超过n停止
while(!increment(str)){
//去掉字符串前的0输出:例如002输出2
int index=0;
while(index<str.length()-1&&str.charAt(index)=='0'){index++;}
arrayList.add(Integer.valueOf(str.toString().substring(index)));
}
//这些是为了leetcode要求输出写的代码
int[] array=new int[arrayList.size()];
int arrayindex=0;
for (Integer temp:arrayList) {
array[arrayindex]=temp;
arrayindex++;
}
return array;
}
public boolean increment(StringBuilder str) {
for (int i = str.length() - 1; i >= 0; i--) {
char s = (char)(str.charAt(i) + 1);
// 如果s大于'9'则发生进位
if (s > '9') {
str.replace(i,i+1,"0");
if (i == 0) {
isOverflow = true;
}
}
// 没发生进位则跳出for循环
else {
str.replace(i,i+1,String.valueOf(s));
break;
}
}
return isOverflow;
}
}