这是我参与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;
};