剑指offer 面试题17. 打印从1到最大的n位数 考虑大数问题时的Java实现

5 篇文章 0 订阅
1 篇文章 0 订阅

面试题17. 打印从1到最大的n位数
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
示例 1: 输入: n = 1 输出: [1,2,3,4,5,6,7,8,9]
说明:用返回一个整数列表来代替打印 n 为正整数

1.前两种方法是解决n取值较小的情况
Java代码如下:


//不调用pow函数
    public int[] printNumbers(int n) {
        int max = 1;
        while(n>0){
            max *=10;
            n--;
        }
        max--;//确定最大数
        int res[] = new int[max];
        for(int i=0;i<res.length;i++){
            res[i] = i+1;
        }
        return res;
    }
    
    //调用pow函数
    public int[] printNumbers2(int n) {
    	int max =(int)(Math.pow(10,n)-1);//(int)不能少   Math.pow(double a,double b) return double
        int res[] = new int[max];
        for(int i=0;i<res.length;i++){
            res[i] = i+1;
        }
        return res;
    }

由于上面最终是输出一个int的数组,就相当于规定了max的范围,即res[max-1]=max<=2^31 − 1 即不需解决大数问题。
但是实际上根据题目原义,输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数,没有对n的范围做出限制,则需要解决大数问题。
2.下面用Java复现剑指书中的解决这道题大数问题的思路(实现题目原意,不返回数组,而是直接打印输出):
字符串+全排列+迭代
思路:全排列用递归很容易表达,数字的每一位都可能是0~9中的一个数,然后设置下一位。递归结束的条件是我们已经设置了数字的最后一位。

1.考查应聘者解决大数问题的能力。面试官出这道题的时候,他期望应聘者能意识到这是一个大数问题,同时还期待应聘者能定义合适的数据表示方式来解决大数问题.
2.用递归方法解决问题的能力。
3.面试官还将关注应聘者打印数字时会不会打印出位于数字前面的0。这里能体现出应聘者在设计开发软件时是不是会考虑用户的使用习惯。通常我们的软件设计和开发需要符合大部分用户的人机交互习惯。
Java代码如下:

package array;

public class Solution17 {

    public void printNumbers3(int n) {//不需要返回 int[]了
    	char[] number = new char[n];
    	for(int i =0;i<n;i++) {
    		number[i]='0';//初始化
    	}
    	iter(number,0);
    }
    
    public void iter(char[] number, int k) {
    
    	if(k==number.length) {
    		print(number); //这种是输出前面不带0的做法 
    		//System.out.println(new String(number));//这里是直接输出数据的方式,但是前面的0会保留
    		return;
    	}
    		
    	for(int j=0;j<=9;j++) {
    		//number[k]=(char)(j+'0');
    		number[k]=(char)(j+48);//加上 48,因为 ASCII 编码 48 到 57 为字符 '0' ~ '9' 的编码
    		//上述两种方式都行
    		
    		// 按照输出习惯,左侧为高位,所以,这里填充顺序是从左到右 number[0]到number[n-1](迭代的方式)
    		//假设当n=3时,按照迭代,number依次取值 000 001 002 003 004....
    		iter(number,k+1);
    	}
    }
    
    public void print(char[] number) {
    	//打印出number的内容,注意:number 001这种前面的00不显示,且全0的number按照题目要求不打印,即打印从1开始
    	int index=-1;
    	for(int i=0;i<number.length;i++) {
    		if(number[i]!='0') { 
    			index =i; 
    			break;}
    	}
    	if(index==-1) return;//全0不输出
    	for(int j=index;j<number.length;j++) {
    		System.out.print(number[j]);//这里要连续打印 比如999 连续打印'9''9''9' 注意不要写成println
    	}
    	System.out.print("\t");//数字之间空4个字符 比如'9''9''8'	'9''9''9'
    }
    
    public static void main(String[] args) {
		Solution17 s = new Solution17();
		s.printNumbers3(3);	
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值