【问题标题】:Given a list of integers and an integer k, return whether k can be built as a sum of any numbers from that list or their multiplications给定一个整数列表和一个整数 k,返回 k 是否可以构建为该列表中任何数字的总和或它们的乘积
【发布时间】:2021-05-10 04:16:54
【问题描述】:

我的一个朋友在面试中被要求解决以下练习,但没有成功。我想自己尝试一下,但乍一看似乎比我难,所以 Stack 社区,请帮助:)

给定一个整数列表和一个整数 k,返回 k 是否可以 构建为该列表中任何数字的总和或这些数字的任何乘法的总和。

ex:对于给定的 [2,3,4] 和 k = 13,对于以下找到的组合 方法应该返回 true。
1) 2、2、2、2、2、3
2) 2、2、2、3、4
3) 2、2、3、3、3
4) 2、3、4、4
5) 3、3、3、4

我已经尝试过的是这样的:

List<Integer> inputList = new List<Integer>{
        2, 3, 4
};
Integer k = 13;
Boolean result = false;

for (Integer i = 0; i < inputList.size(); i++) {
    for (Integer j = 0; j < inputList.size(); j++) {
        if (k >= inputList.get(i) && Math.mod(k - inputList.get(i), inputList.get(j)) == 0) {
            result = true;
            break;
        }
    }
    if (result == true) {
        break;
    }
}

return result;

但不幸的是,这不是正确的解决方案,因为它没有考虑这种情况,当 k 不能被输入列表中的每个数字整除时,仍然有两个以上的数字(或它们的乘积)汇总在一起会导致给定 k。考虑素数,例如:[17, 53, 97] 和 k=167。它们都不是 k 除数,但总和结果为 167。

任何想法如何解决?我正在考虑递归,但也有人告诉我,这可以用更简单的方式解决,只需大约 10 行代码。

PS:我在 APEX 中编写了我的 sn-p,这是一种简化的 java。它没有流、向量、 广泛的收藏等,但这项任务是一个数学问题,所以任何形式的帮助都将不胜感激!

【问题讨论】:

    标签: loops recursion math nested-loops


    【解决方案1】:

    我认为乘法并不重要,因为加法可以达到相同的结果。试试这个 DP 方法

    L=[1]+[0]*k
    for n in nums:
        for m in range(n,k+1):
            L[m]+=L[m-n]
    print(L[-1]>0) #L[-1] is the number of combinations you can reach k by addition
    

    【讨论】:

      猜你喜欢
      • 2018-12-20
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      相关资源
      最近更新 更多