算法题---打印从1到最大的n位数

308 阅读1分钟

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

算法题---打印从1到最大的n位数

题目描述:输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999,结果用数组输出。

示例 1:

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

解题思路一:

Math.pow(x, y)方法:

作用:返回 x 的 y 次幂的值。

参数:

  • x : 必需,类型为数字,代表底数。
  • y : 必需,类型为数字,代表幂数。

也就是说,Math.pow(10, 1) = 10; Math.pow( 10, 2) = 100; Math.pow( 10, 3) = 1000; Math.pow( 10, 4) = 10000;......所以,我们利用这个函数就可以找到退出循环的边界值。下面是代码实现:

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

解题思路二:

利用数字转为字符串的长度判断边界值,比如:当n=1,边界值为9,转为字符串长度为1;当n=2,边界值为99,转为字符串长度为2;当n=3,边界值为999,转为字符串长度为3;... ... 可以看出,最大边界值转为字符串的长度刚好等于n。代码实现如下:

var printNumbers = function(n) {
    let res=[]
    let cur=1
    while(cur.toString().length<=n){
        res.push(cur)
        cur++
    }
    return res
};

解题思路三:

针对边界值,无法通过Math.pow()得出的情况下,我们找到规律,知道n代表位数,然后就可以得出max值为n个'9'的累加组合。我们可以累加n个字符串‘9‘,比如,当n=1,边界值为’9‘;当n=2,边界值为’99‘;当n=3,边界值为’999‘;... ... 在使用for循环,以刚刚的边界值为退出循环条件,累加结果到数组中。代码如下:

var printNumbers = function(n) {
    var printNumbers = function (n) {
        let max = '';
        while (n--) {
            max += '9';
        }
​
        for (let i = 1, l = max - '0'; i <= l; i++){
            res.push(i);
        }
    };
    return res
};

解题思路四:

关键点: 运算符 ' ** ' 代表求次幂。

针对边界值,也可以直接使用n**10-1,取得边界值,比如,当n=1,边界值为' 10 * * 1-1=9 ';当n=2,边界值为' 10 * * 2-1=99 ';当n=3,边界值为' 10 * * 3-1=999 ';当n=4,边界值为' 10 * * 4-1=9999 ';... ... 代码如下:

var printNumbers = function(n) {
   let max = 10 ** n - 1;
    const res = [];
    for (let i = 1; i <= max; i++) {
        res.push(i);
    }
    return res;
};

参考

leetcode-cn.com/problems/da…