javascript - 查找数组中的一个或多个数字是否可以加起来等于某个数字

标签 javascript algorithm loops

假设我有一个像 9 这样的集合数字和一个包含 #s [1,2,4,6,3,9] 的数组。我想知道什么是循环遍历并查看其中一个或多个#s 是否可以加起来为 9 的最佳方法。我最初的想法是:

  • 检查当前数组索引值是否等于magicNum
  • 如果当前数小于magicNum,则将其与数组中的另一个数相加并不断循环看是否匹配
  • 如果上述方法无效,请转到下一个数字并重复。

我的第一个支票很好,但我遇到了另外两个问题。我知道对于初学者来说,除了使用 reduce 之外,可能还需要(也可能不需要)递归函数。算法不是我的强项(目前),但我渴望并且非常愿意改进。任何类型的指导都将不胜感激。

const magicNum = 9;

const arr = [10,1,2,4,6,3];

for (let i = 0, arrLength = arr.length; i < arrLength; i++) {
  if (arr[i] === magicNum) {
    console.log('Number Found!');
    continue;
  } else if (arr[i] > magicNum) {
    continue;
  } else if (arr[i] < magicNum) {
    // Stuck here
  }
}

最佳答案

您可以采用迭代和递归的方法来查找子集和。

function getSubsets(array, sum) {

    function fork(i = 0, s = 0, t = []) {
        if (s === sum) {
            result.push(t);
            return;
        }
        if (i === array.length) {
            return;
        }
        if (s + array[i] <= sum) { // shout circuit for positive numbers only
            fork(i + 1, s + array[i], t.concat(array[i]));
        }
        fork(i + 1, s, t);
    }

    var result = [];
    fork();
    return result;
}

console.log(getSubsets([10, 1, 2, 4, 6, 3], 9));
.as-console-wrapper { max-height: 100% !important; top: 0; }

为了仅获取第一个子集,您可以使用第一个找到的值数组退出递归。

function getFirstSubset(array, sum) {

    function fork(i = 0, s = 0, t = []) {
        if (s === sum) {
            return  t;
        }
        if (i === array.length) {
            return;
        }
        return fork(i + 1, s + array[i], t.concat(array[i]))
            || fork(i + 1, s, t);
    }

    return fork();
}

console.log(getFirstSubset([10, 1, 2, 4, 6, 3], 9));
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 查找数组中的一个或多个数字是否可以加起来等于某个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51891252/

相关文章:

javascript - angularjs 在 ng-repeat 中展开所有 Accordion

JavaScript URL 重定向不起作用

javascript - 使用 React Native 对电话联系人进行排序

javascript - Game of Life : Tried to increase computation efficiency with new algorithm, 反而减少了。为什么?

arrays - 在bash中同时迭代两个数组

javascript - ReactJS 中的 Bootstrap 行

javascript - Nodejs 文件中函数的上下文是什么?

algorithm - 长方体的 RANSAC

java - 如何在 Java 中创建一个程序,它获取给定位数的 1 和 2 的所有组合

c - 如何使用指针交换数组