问题描述:

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

思路1:最简单的想法就是先找出最大的n位数,然后循环打印即可。

public static void Print1ToMaxOfNDigits_1(int n){
int number = 1;
int i = 0;
while(i++ < n){
number *= 10;
}
//number-1是最大的n位数
for(int j = 1; j < number; j++){
System.out.println(j);
}
}

然而上述程序在n很大时,显然会有溢出,int 的范围不够。那么我们会想到用long来存储,但是如果n的值还是很大,以至于long也无法满足要求。那么该怎么办?

只能用其他的数据结构来存储我们的非常大的数字。

思路2:用字符串来存储数字。

    public static void Print1ToMaxOfNDigits_2(int n){

        if(n <= 0){
return;
}
StringBuffer number = new StringBuffer(); for(int i = 0; i < n; i++){
number.append('0'); } while(!Increment(number)){
PrintNumber(number);
}
}
public static boolean Increment(StringBuffer s){
boolean isOverflow = false;
int nTakeOver = 0;
int nLength = s.length();
for(int i = nLength - 1; i >= 0; i--){
int nSum = s.charAt(i) - '0' + nTakeOver;
if( i == nLength - 1){
nSum++;
}
if(nSum >= 10){
if(i == 0){
isOverflow = true; }else{
nSum -= 10;
nTakeOver = 1;
s.setCharAt(i, (char) ('0' + nSum));
} }else{
s.setCharAt(i, (char) ('0' + nSum));
break;
}
}
return isOverflow;
} public static void PrintNumber(StringBuffer s){
boolean isBeginning0 = true;
for(int i = 0; i < s.length(); i++){
if(isBeginning0 && s.charAt(i) != '0'){
isBeginning0 = false;
}
if(!isBeginning0){
System.out.print(s.charAt(i));
}
} System.out.println();
}

Increment要注意终止条件

打印函数:要注意处理前面的‘0’字符

思路3:用数字排列的方法表示:如果我们在数字前面补0的话,就会发现n位所有十进制数其实就是n个从0到9的全排列。也就是说,我们把数字的每一位都从0到9排列一遍,就得到了所有的十进制数。当然打印的时候,我们应该将前面的0补位去掉。

public static void Print1ToMaxOfNDigits_3(int n){
if(n < 0){
return;
}
StringBuffer s = new StringBuffer(n);
for(int i = 0; i < n; i++){
s.append('0');
}
for(int i = 0; i < 10; i++){ s.setCharAt(0, (char) (i+'0'));
Print1ToMaxOfNDigits_3_Recursely(s, n, 0);
} }
public static void Print1ToMaxOfNDigits_3_Recursely(StringBuffer s, int n , int index){
if(index == n - 1){
PrintNumber(s);
return;
} for(int i = 0; i < 10; i++){
s.setCharAt(index+1, (char) (i+'0'));
Print1ToMaxOfNDigits_3_Recursely(s, n, index+1);
}
}
public static void PrintNumber(StringBuffer s){
boolean isBeginning0 = true;
for(int i = 0; i < s.length(); i++){
if(isBeginning0 && s.charAt(i) != '0'){
isBeginning0 = false;
}
if(!isBeginning0){
System.out.print(s.charAt(i));
}
} System.out.println();
}

剑指Offer:面试题12——打印1到最大的n位数(java实现)的更多相关文章

  1. 剑指Offer - 九度1515 - 打印1到最大的N位数

    剑指Offer - 九度1515 - 打印1到最大的N位数2013-11-30 01:11 题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案 ...

  2. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  3. 【剑指offer 面试题12】打印1到最大的n位数

    思路: 用n位字符数组表示n位数,通过递归的方式逐层(位)遍历,递归终止时打印. #include "stdio.h" #include "string.h" ...

  4. 《剑指offer》面试题12 打印1到最大的n位数 Java版

    书中方法:这道题的一个陷阱在于不能用int或者long去存储你要打印的数,然后用打印函数打印,因为这个数可能会很大.如果加1后超出了最大的n位数,就不打印了.用最高位是否进位判断是否结束,打印的时候注 ...

  5. 剑指offer面试题3 二维数组中的查找 (java)

    注:java主要可以利用字符串的length方法求出长度解决这个问题带来方便 public class FindNum { public static void main(String[] args) ...

  6. 剑指offer面试题12-打印1到最大的n位数

    题目: 输入一个数字n,按顺序打印出从1最大的n位十进制数.比方输入3,则打印出1.2.3最大的三位数即999 这道题的主要陷阱就在大数的处理,仅仅要将这个考虑进去,用字符串来表示.就好说了. 那差点 ...

  7. 剑指Offer:面试题29——数组中出现次数超过一半的数字(java实现)

    PS:在前几天的面试中,被问到了这个题.然而当时只能用最低效的方法来解. 问题描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2, ...

  8. 剑指Offer:面试题7——用两个栈实现队列(java实现)

    题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 首先定义两个栈 Stack<Integer> stack1 = new Stack<I ...

  9. 剑指offer编程题Java实现——面试题12打印1到最大的n位数

    题目:打印1到最大的n位数 输入数字n,按顺序打印输出从1到最大的n位十进制数,比如输入3,打印从1到999. 这道题考察的地方是如何表示大数问题.由于n是任意大的数组,如果n太大的话n位数就超过了l ...

随机推荐

  1. synergy帮组提升办公效率

    这个synergy确实很不错哦,当你在办公室拥有两台或者多台电脑的时候,放在面前多台显示器,多个鼠标,多个键盘,但是你的桌面上,是不是多出了些你不需要看到的键盘或者鼠标?至少我是这样子的,我希望多个显 ...

  2. Angular学习(5)- 数组双向梆定+filter

    示例: <!DOCTYPE html> <html ng-app="MyApp"> <head> <title>Study 5< ...

  3. jQuery 工具类库集锦

    备注:待验证. ...................................以下待验证................................ 今天度娘发现这个内容,原来我一直做的都 ...

  4. 【centos7】设置开机自启动服务--systemd

    centos7使用systemd管理开机自启动服务,不提倡rc.local. 假设现在有2个服务,分别为: my111: my222: 希望在开机时自动启动my222服务,但是my222启动需要my1 ...

  5. bzoj3917: [Baltic2014]sequence

    Description  序列A由从N开始的连续K个数按顺序构成,现在将A中的每个数只保留某一个数码,记为序列B,给定K和B,求可能的最小的N Input 第一行一个数K,第二行K个数B_i Outp ...

  6. Learning Puppet — Resource Ordering

    Learning Puppet — Resource Ordering Learn about dependencies and refresh events, manage the relation ...

  7. 纯js上传控件——fineuploader

    fineuploader是一款基于ajax实现文件上传的插件,具有以下有点: A:支持文件上传进度显示. B:文件拖拽浏览器上传方式 C:Ajax页面无刷新. D:多文件上传. F:跨浏览器. E:跨 ...

  8. POJ 2318 TOYS(计算几何)

    题目大意:有一个矩形盒子,盒子里会有一些木块线段,并且这些线段是按照顺序给出的,有n条线段,把盒子分层了n+1个区域,然后有m个玩具,这m个玩具的坐标是已知的,问最后每个区域有多少个玩具 解题思路:因 ...

  9. NeHe OpenGL教程 第十六课:雾

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  10. 移动设备wap手机网页html5通过特殊链接:打电话,发短信,发邮件详细教程

    如果需要在移动浏览器中实现拨打电话,调用sms发短信,发送email等功能,移动手机WEB页面(HTML5)Javascript提供的接口是一个好办法. 采用url href链接的方式,实现在Safa ...