计算达到目标数

时间:2017-11-15 22:07:58

标签: javascript

我正在使用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到目标数字

2 个答案:

答案 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);

相关问题