剑指offer(13)——打印从到最大的n位数

90 阅读2分钟

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

题目 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。 思路 因为上面分析可知我们在遇到比长整型还大的数时,上面的代码是不能成功执行的,即基本类型已经存储不下的数字。这时我们需要考虑用字符串或者数组来表示大数。

用字符串表示数字的时候,最直观的方法就是字符串里每个字符都是‘0’到‘9’之间的某一个字符,用来表示数字中的一位。因为最大的是n位的,因此我们需要一个长度为n+1的字符串(字符串中最后一个是结束符号‘\0’。当实际数字不够n位的时候,在字符串的前半部分补0)。

首先我们把字符串中的每一个数字都初始化为‘0’,然后每一次为字符串表示的数字加1,再打印出来。故我们只需要做两件事:一是在字符串表达数字上模拟加法,二是把字符串表达的数字打印出来。

在字符串表达数字上模拟加法,我们首先设置是否溢出标识,是否进位标识,以及取得字符数组长度,遍历这个字符数组,在末尾进行+1操作,如果末尾字符在+1后变为不小于10的数字,我们将末尾减去10加上‘0’字符赋值为末位,进位标识设置为1,在循环次位时+1,然后再判断是否为不小于10,是的话重复上面的步骤。直到判断高位是不是不小于10,是的话字符数组溢出;如果末尾字符在+1后是小于10的数字,直接加上‘0’赋值给末尾,跳出当前循环,返回没有溢出。

在字符串表达的数字打印出来方法时,没有什么特别,直接利用for循环遍历输出字符数组,但是要从高位第一个不是0的开始输出。 ————————————————

示例 1:

输入: n = 1 输出: [1,2,3,4,5,6,7,8,9]

var printNumbers = function(n) {
    var max = Math.pow(10,n) 
    var arr=[]
    for(var i=1;i<max;i++){
        arr.push(i)
    }
    return arr
};