前两天和朋友聊天,朋友说的一个面试题:
设计一个算法,找到数组中所有和为指定值的整数对
觉得这个问题提有趣,写几句感谢。
首先算法是为目标服务的,所以,要先明确应用场景。
如果是一个固定数组,而且需要多次查找不同的指定值时,无疑对固定数组先进行排序是比较好的方法。
废话说完,我写一个不排序的伪代码
#include <set>
#include <tuple>
#include <vector>
void GetIntegerPairs(const std::vector<int>& array, const int sum, std::vector<std::tuple<int, int>>& result) {
std::set<int> candidate;
for (const auto& item: array) {
int v = sum - item;
if (candidate.find(item) != candidate.end()) {
candidate.insert(v);
} else {
result.push_back(std::make_tuple(v, item));
}
}
}
为了简单,这个没有完全去重
例如sum为4时,数组如果为3, 1, 1,则为2组结果: (3, 1), (3, 1)
但如果数组为3, 3, 1,则为1组结果:(3, 1)
但如果数组是3,1,3,这时2组结果:(3, 1), (1, 3),这个是否认为是重复也要看目标。
所以,这就是伪算法(虽然能编译)。