剑指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’
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’
相关文章推荐
- 剑指Offer(java版):在O(1)时间删除链表节点
- 剑指offer(Java版):调整数组顺序使奇数位于偶数的前面
- 剑指Offer(Java版):链表中倒数第K个结点
- PHP5 non-thread-safe和thread-safe的区别
- What is GoLISMERO-web knife
- js积累
- [LeetCode] 24. Swap Nodes in Pairs
- H5视频直播扫盲
- JavaScript基于时间的动画算法
- js中arguments.callee在递归函数中的妙用
- css揭秘--笔记(未完)
- 引用js文件
- 剑指offer——对称的二叉树判断
- React Native - window 环境安装与配置
- CodeForces 347A Difference Row (水题)
- WEB前端 :“懒人”养成计划
- html中的a标签(超链接)的使用
- butterknife8.0.1提示NullPointerException空指针的问题
- EJS.Helpers进阶
- html浏览器