我正在使用JavaScript中的函数来获取一个数字数组,例如:[5, 10, 18, 25, 30]
然后返回一个数组,其中包含从{{1}获取所需的最小操作数通过仅添加0
或乘以1
来确定目标号码。
例如,从数组中,数字2
将返回5
,因为您执行了4
。
如果传入的数组是0 + 1 = 1 x 2 = 2 x 2 = 4 + 1 = 5
,则输出数组将是[5,5,5]
。
我已经看过这个问题的潜在解决方案,其中一些使用了迭代和其他递归。我在Code Review - Find sequence by adding 5 or multiplying by 3找到了类似问题的答案。
唯一的区别是这是增加5或乘以2,它从1开始而不是0.我试图调整这个解决方案以满足我的需要,但是,出于某种原因,代码只会[4,4,4]
而不是add 1
。因此,对于输入times 2
,我返回的是5
,这显然不是最短的解决方案。
最终我确实需要这个来返回一个数组,因为输入也是一个数组,但是我很难将这个上述答案的改编工作,只需要将一个整数作为参数。< / p>
当我将0 + 1 = 1 + 1 = 2 + 1 = 3 + 1 = 4 + 1 = 5
传递给此函数时,我将返回5
而不是最短的解决方案5
,因为它只是4
。
我目前的代码是:
adds 1
我该如何使这项工作?我需要返回最短序列计数,只需添加1 或乘以2
从0到目标数字答案 0 :(得分:1)
这样的事情怎么样:
function findMoves(target)
{
arr = [];
while (target != 1)
{
if (target %2 == 0)
{
target /= 2;
arr.unshift(target + " x " + 2);
continue;
}
target -= 1;
arr.unshift(target + " + " + 1);
}
arr.unshift("0 + 1");
return arr;
}
res = findMoves(9);
console.log(
"TotalMoves: " + res.length + "\n" +
"What moves: " + res.join(', '));
打印:
TotalMoves: 5
What moves: 0 + 1, 1 x 2, 2 x 2, 4 x 2, 8 + 1
答案 1 :(得分:0)
这可能更容易反过来。从目标开始,然后应用减1 或除以2 ,直到达到零。一旦找到该序列,将其反转并使用反操作(加1,乘2)返回目标。
function getNext(num) {
if (num === 0) return "end"
if (num % 2 === 1) return "minus"
return "div"
}
function makeSequence(num, ls) {
const next = getNext(num);
if (next === "end") return ls;
ls.push(next)
if (next === "div") return makeSequence(num/2, ls);
if (next === "minus") return makeSequence(num-1, ls);
}
function reverseSequence(sqn) {
return sqn.reverse().map(x => x === "minus" ? "plus" : "times");
}
var sqn = makeSequence(5, []);
var reversedSqn = reverseSequence(sqn)
console.log("Takes", reversedSqn.length, "steps with target of 5");
console.log("Steps are:", reversedSqn);
var bigSqn = makeSequence(200, []);
var bigReversedSqn = reverseSequence(bigSqn);
console.log("Takes", bigReversedSqn.length, "steps with target of 200");
console.log("Steps are:", bigReversedSqn);