函数以扩展形式返回数组中的数字?



我一直在尝试为我正在研究的东西创建上面提到的函数

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是数字的最后一位。p1开始,每一步乘以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))

后两个变量对于最后一个零数字的行为略有不同;如果需要,我们可以修改其中一个以匹配另一个。

相关内容

  • 没有找到相关文章

最新更新