剑指 Offer 17. 打印从 1 到最大的 n 位数
剑指 Offer 17. 打印从 1 到最大的 n 位数
题目描述
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
说明:
- 用返回一个整数列表来代替打印
- n 为正整数
解一
解题思路
计算出最大的 n 位十进制数,并循环输出
时间复杂度O(10n),空间复杂度O(10n)
代码
class Solution {
public int[] printNumbers(int n) {
int maxNumber=1;
for(int i=0;i<n;i++){
maxNumber=maxNumber*10;
}
maxNumber=maxNumber-1;
int res[]=new int[maxNumber];
for(int i=1;i<=maxNumber;i++){
res[i-1]=i;
}
return res;
}
}
解二
解题思路
原题考察点为大数计算,int和long型都有可能溢出,字符串类型不会溢出。按加法进位的逻辑来解:
时间复杂度O(10n),空间复杂度O(10n)
代码
class Solution {
public int[] printNumbers(int n) {
StringBuilder str=new StringBuilder();
for(int i=0;i<n;i++){
str.append("0");
}
int[] res = new int[(int)Math.pow(10,n)-1];//Math.pow返回类型是double
int countRes=0;
while(!isMaximum(str)){
//isMaximum当溢出时返回true
int indexZero=0;
while(indexZero<n && str.charAt(indexZero)=='0'){
indexZero++;
}
res[countRes]=Integer.parseInt(str.toString().substring(indexZero));
countRes++;
}
return res;
}
public boolean isMaximum(StringBuilder str){
boolean isCarry=false;
for(int i=str.length()-1;i>=0;i--){
//每次循环都从最低位开始
//1. 不进位时,退出循环,并在主函数中获取字符串+1后的值:
// 例如str从00012->00013
//2. 进位时,不退出循环,i--代表i指向更高一位,更高一位上的数(0)加1:
// 例如0099->0090->0000->0100
char current=(char)(str.charAt(i)+1);
if(current>'9'){
str=str.replace(i,i+1,"0");
if(i==0){//i为0时,是数字的最高位。最高位为0说明溢出了
isCarry=true;
}
}else{
str.replace(i,i+1,String.valueOf(current));
break;
}
}
return isCarry;
}
}

浙公网安备 33010602011771号