我一直在尝试为我正在研究的东西创建上面提到的函数
function expandedForm(num: number): number[] {
// ...
}
const k = expandedForm(8571);
console.log(k);
// [ 8000, 500, 70, 1 ]
在线搜索this只会找到返回数字之间有+
加号的字符串的函数。如果你能帮忙,我会很感激的。
可以使用余数运算符对输入进行操作:
function expandedForm(num: number): number[] {
const arr: number[] = [];
var x = num;
// Iterate until `x` is greater than zero
//
// For each iteration, keep track of the `i`:
// First iteration, i == 0, 10^i == 10^0 == 1
// Second iteration, i == 1, 10^i == 10^1 == 10
// Third iteration, i == 2, 10^i == 10^2 == 100
// This variable will let you know the current decimal place
for (var i = 0; x > 0; i++) {
// Get the last digit of `x` by using the remainder operator
const currentDigit = x % 10;
// Insert to the array using the previous algorithm
arr.push(Math.pow(10, i) * currentDigit);
// Remove the last digit of `x` using the floor of the division by 10
x = Math.floor(x / 10);
}
// Reverse the array
return arr.reverse();
}
const k = expandedForm(8571);
console.log(k);
或者,您可以插入到arr
的第一个元素,而不需要在最后反转它:
function expandedForm(num: number): number[] {
const arr: number[] = [];
var x = num;
for (var i = 0; x > 0; i++) {
const currentDigit = x % 10;
// Insert into the first element of `arr`
arr.splice(0, 0, Math.pow(10, i) * currentDigit);
x = Math.floor(x / 10);
}
// Just return the array
return arr;
}
const k = expandedForm(8571);
console.log(k);
拜托,下次,包括你自己的尝试,并解释它是如何失败的。
但是由于这里已经有了一个可行的答案,我将简单地发布我的版本,这两个版本都与上面的不同。
一种方法是用数学方法来完成,使用递归,并将8571
的值传递给857
,然后传递给85
,最后传递给8
,将每个10的幂的正确倍数添加到运行列表中。它可以像这样:
const expandedForm = (n, p = 1, d = n % 10) =>
n < 10
? [n * p]
: expandedForm ((n - d) / 10, p * 10) .concat (d * p)
console .log (expandedForm (8571))
p
是当前的10的幂,d
是数字的最后一位。p
从1
开始,每一步乘以10
。
第二种方法是将n
转换为字符串,将其拆分为数字,然后将每个数字映射为相应的10的倍数:
const expandedForm = (n, [... ds] = String (n)) =>
ds .map ((d, i) => d * 10 ** (ds .length - 1 - i))
console .log (expandedForm (8571))
在这两个中,我更喜欢第一个的优雅,更数学,一个。但两者都可以。
请注意,这两种方法都会在输出中留下零,因此,例如,8501
产生[8000, 500, 0, 1]
。这可能合适,也可能不合适。如果您希望得到[8000, 500, 1]
,那么这两个都很容易修复:
const expandedForm = (n, p = 1, d = n % 10) =>
n < 10
? [n * p]
: expandedForm ((n - d) / 10, p * 10) .concat (d > 0 ? d * p : [])
或
const expandedForm = (n, [...ds] = String (n)) =>
ds .filter (d => d !== '0')
.map ((d, i) => d * 10 ** (ds.length - 1 - i))
后两个变量对于最后一个零数字的行为略有不同;如果需要,我们可以修改其中一个以匹配另一个。