面试题 12

1 题目描述

题目:输入数字 n, 按顺序打印从 1 到 最大位 n 位十进制数。
比如输入 3 打印 1,2,3 一直打印到 999


2 解法描述

1 乍看之下的解法

public static void  print12Max(int n){
    int result=1;
    int i;
    if(n<=0) return;
    for(i=0;i<n;i++){
        result*=10;
    }   
    for(i=1;i<result;i++){
        System.out.println(i);
    }
}

存在问题;当 n 值很大时会导致越界出现错误情况,没有考虑大数情况


2 在字符数组上模拟数字加法,解决大数溢出问题

public static void  print12Max_1(int n){
    //用长度为 n 的字符数组表示数字
    char[] number=new char[n];
    int i;
    if(n<=0) return;
    for(i=0;i<n;i++){
        number[i]='0';
    }
    while(increment(number)){
        printResult(number);
    }

}


private static boolean increment(char[] number){
    boolean overflow=true;
    int takeover=0;
    int i;
    int len=number.length-1;
    for(i=len;i>=0;i--){
        int sum=number[i]-'0'+takeover;
        if(i==len){
            sum++;
        }
        if(sum>=10){
            if(i==0){
                overflow=false;
                break;
            }else{
                number[i]='0';
                takeover=1;
            }
        }else{
            number[i]=(char) (sum+'0');
            break;
        }               
    }       
    return overflow;
}
private static void printResult(char[] number){
    boolean flag=true;
    for(int i=0;i<number.length;i++){
        if(number[i]=='0'&&flag){
        }else{
            flag=false;
            System.out.print(number[i]);
        }
    }
    System.out.println();
}

上述代码使用字符数组模拟整数的加法,代码有点长,接下来换一种思路来考虑这个问题,n 位所有的十进制数其实就是 n 个从 0 到 9 的全排列,也就谁说,我们把数字的每一位从 0 到 9 排列一遍,就得到了所有的十进制数,只是打印的时候,数字排在前面的 0 不打印出来。
比如 n=10 时
依次打印
0000000001
……
0000000009
0000000010
……
9999999999

public static void  print12Max_2(int n){
    if(n<=0) return;
    char[] number=new char[n];
    for(int i=0;i<n;i++){
        number[i]='0';
    }
    for(int i=0;i<10;i++){
        number[0]=(char) (i+'0');
        showRecursive(number,0);
    }
}

private static void showRecursive(char[] number,int index){
    if(index==number.length-1){
        printResult(number);
        return;
    }

    for(int i=0;i<10;i++){
        number[1+index]=(char) (i+'0');
        showRecursive(number,index+1);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值