【发布时间】:2019-11-01 23:45:16
【问题描述】:
我订阅了一份编码挑战邮件列表。这是今天的:
给定一个数字列表和一个数字 k,返回列表中任意两个数字加起来是否为 k。
例如,给定 [10, 15, 3, 7] 和 k of 17,返回 true,因为 10 + 7 是 17。
奖励:你能一次性完成吗?
我想出了以下方法,但我想知道这是否是最有效的解决方案。
bool found = false;
int k = 17;
list<int> given({10, 15, 3, 7});
int main() {
for (int num : given) {
found = find(given.begin(), given.end(), k - num) != given.end();
if (found) break;
}
return found;
}
代码完美无缺。我只是想知道它是否可以更有效或 如果我在我的代码中做任何在工作场所不受欢迎的事情。非常感谢。
【问题讨论】:
-
它不能完美运行。如果
k = 6将计数3两次。 -
即使它确实可以完美运行,假设您有 1000 个号码,而不是 4 个号码。您的循环将迭代 1000000 次。这听起来有效率吗?跳出框框思考,即以某种方式记住您已经看到的数字。
-
奖金意味着它可以在一次通过中完成,并且这样做 n 次。
-
如果您使用大小为 k+1 的标志数组,并且每个数字恰好执行 0 或 2 次数组写入,则可以在 1 次通过。
-
另外,如果任何问题的解决方案涉及嵌套的
for循环,它几乎总是低效的。如果您看到自己在写for (int i = 0; i < n; ++i) { for (j = 0; j < n; ++j;)或类似的东西,请停下来采取不同的方法。
标签: c++ performance