0%

剑指offer018打印从 1 到最大的 n 位数

Problem:

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

Intuition:

由于 n 可能会非常大,因此不能直接用 int 表示数字,而是用 StringBuffer进行存储。既然是用StringBuffer来存,那么我们就要完成两个功能,第一个功能是如何对使用char数组存储的数字进行递增,第二个功能是如何将该数字打印出来(这个部分的核心代码主要是去掉符号扩展自动补上的0).

Solution:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class CodingInterview_017 {

public static void main(String[] args) {

Print1ToMaxOfNDigits(4);
}

public static void Print1ToMaxOfNDigits(int n){
StringBuffer stringBuffer=new StringBuffer();
for(int i=0;i<n;i++){
stringBuffer.append('0');
}
while(!Increment(stringBuffer)){
PrintNumber(stringBuffer);
}

}
//自加
public static boolean Increment(StringBuffer s) {
//因为是要在原来数字的基础上递增1,所以默认加1,这个1就放在个位的carry上
int carry=1;//carry表示进位
for(int i=s.length()-1;i>=0;i--){
int digit=s.charAt(i)-'0';
digit=digit+carry;
if(digit>=10){
digit-=10;
carry=1;
}else{
carry=0;
}
s.setCharAt(i,(char)(digit+'0'));
}
if(carry==1){
return true;
}else{
return false;
}
}

//打印数字
public static void PrintNumber(StringBuffer s){
int startPos=0;
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='0'){
startPos++;
}else{
break;
}
}
for(int i=startPos;i<s.length();i++){
System.out.print(s.charAt(i));
}
System.out.println();
}

}