zoukankan      html  css  js  c++  java
  • 剑指offer面试题12-打印1到最大的n位数

    题目:

    输入一个数字n,按顺序打印出从1最大的n位十进制数。比方输入3,则打印出1、2、3最大的三位数即999


    这道题的主要陷阱就在大数的处理,仅仅要将这个考虑进去,用字符串来表示。就好说了。


    那差点儿相同代码是这样子的:

    public void print1(int n) {
    		if (n < 0) {
    			throw new RuntimeException();
    		}
    		char[] number = new char[n];
    		// 初始化全部的数都为'0'
    		initNumber(number);
    		// 假设没有达到'99..',而且递增
    		while (increaseNumber(number)) {
    			// 打印
    			printNumber(number);
    		}
    
    	}


    1.怎么初始化呢?

    这个简单:

    private void initNumber(char[] number) {
    		for (int i = 0; i < number.length; i++) {
    			number[i] = '0';
    		}
    	}

    2.怎么打印?
    到时候肯定有非常多00011这样0开头的数字

    假设0开头就不打印0。到了不是0开头的,就打印后面的

    private void printNumber(char[] number) {
    		boolean flag = false;
    		for (int i = 0; i < number.length; i++) {
    			if (number[i] != '0') {
    				flag = true;
    			}
    			if (number[i] != '0' || flag) {
    				System.out.print(number[i]);
    			}
    		}
    		System.out.println();
    	}

    3.怎么递增,而且当增到某个999的时候返回false,事实上时候返回true?

    3.1先是怎样递增:

    那就模拟数字的递增:给最后位上加一。假设大于9了,就再往上一位加1,一直往上。

    3.2怎样返回true。

    false

    接着递增的说,比方一个长度n=3的数,最后一位加1,大于9了前一位再加一。

    也就仅仅有当999加1的时候,遍历从i=0到i<3最后结果还是大于9的,所以就能够依据这个来确定返回值。

    private boolean increaseNumber(char[] number) {
    		for (int i = number.length - 1; i >= 0; i--) {
    			number[i] = (char) (number[i] + 1);
    			if (number[i] > '9') {
    				number[i] = (char) (number[i] - 10);
    			} else {
    				return true;
    			}
    		}
    		return false;
    	}
    


  • 相关阅读:
    把一个数组 赋值给一个新数组
    上传图片时进行压缩
    input上传文件 显示进度条
    vue 后台接口返回文件流地址的下载
    时间戳转换
    JS 两个含有部分相同属性的对象如何快速给对应的key赋值
    javascript中把一个数组的内容全部赋值给另外一个数组
    微信小程序wxs如何使用
    优化内存
    解决position:fiexd相对父元素定位
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7352592.html
Copyright © 2011-2022 走看看