您的位置:首页 > Web前端

剑指Offer(Java版):打印1到最大的n位数

2016-07-19 00:00 357 查看
题目:输入数字n,按顺序打印出从1最大的的n位数十进制数。比如输入3,则打印出1,2,3一直到最大的3位数即999.

1、跳进面试官的陷阱

这个题目看起来很简单。我们看到这个问题后,最容易想到的办法是求出最大的n位数,然后用一个循环从1开始逐个打印。于是我们很容易写出下面的代码。

package cglib;

public class List1
{

public static int print1ToMaxOfNDigits(int n){

int number =1;

int i =0;

while(i++< n)

number*=10;

for(i =1;i<number;i++)

System.out.println(i);
return i;

}
public static void main(String[] args) throws Exception{

print1ToMaxOfNDigits(3);
}
}

初看之下没有问题,但如果仔细分析这个问题,我们就能注意到面试官没有规定n的范围。当输入n很大的时候,我们求最大的n位数是不是用整型(int)或者长整型(long long)都会溢出?也就是说我们需要考虑大数问题。这是面试官在这道题里设置的一个大陷阱。

2、在字符串上模拟数字加法的解法:

经过前面的分析,我们很自然的想到解决这个问题需要一个大数。最常用的也是最容易的用字符串或者数组表达大数。接下来我们用数组来解决大数问题。

用字符串表达数字的时候,最直观的方法就是字符串里每个字符都是’0’到’9’之间的某一个字符,表示数字中的某一位。因为数字最大是n位的,因此我们需要一个n+1位字符串(最后一位为结束符号’/0’)。当实际数字不够n位的时候,在字符串的前半部分补零。这样,数字的个位永远都在字符串的末尾(除去结尾符号)。如n=3,则需要4位字符串,‘1’,‘ 2’, ‘3’, ‘/0’,

不够时就是 ‘0’,‘ 0’, ‘3’, ‘/0’ ,

首先我们把字符串中每一位数字都初始化为’0’。然后每一次对字符串表达的数字加1,再输出。

‘0’,‘ 0’, ‘0’, ‘/0’ ,第一次 ‘0’,‘ 0’, ‘1’, ‘/0’

因此我们只需要做两件事:一是在字符串表达的数字上模拟加法。另外我们要把字符串表达的数字输出。值得注意的是,当数字不够n位的时候,我们在数字的前面补零。输出的时候这些补位的0不应该输出。比如输入3的时候,那么数字98以098的形式输出,就不符合我们的习惯了



‘0’,‘ 9’, ‘8’, ‘/0’
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: