我得到一个包含4个随机数列表(1到10)的数组。我应该生成一个包含3个数字(包括1到10)的列表,这样我就可以通过添加生成列表的3个数字来生成初始列表的所有4个数字。
有人请提供执行此操作的算法。
答案 0 :(得分:2)
由于解决方案仅包含3个数字,这些数字在1..10范围内,因此非常强大 这里是一个有效的算法(即使在天真的实现中也最多可以检查1000种)。所以C#代码可能是
public static int[] BruteForce(int[] data) {
HashSet<int> hs = new HashSet<int>();
for (int x = 1; x <= 10; ++x)
for (int y = x; y <= 10; ++y)
for (int z = y; z <= 10; ++z) {
hs.Clear();
for (int i = 0; i < data.Length; ++i)
hs.Add(data[i]);
hs.Remove(x);
hs.Remove(y);
hs.Remove(z);
hs.Remove(x + y);
hs.Remove(x + z);
hs.Remove(y + z);
hs.Remove(x + y + z);
if (hs.Count <= 0)
return new int[] { x, y, z }; // <- Solution
}
return new int[] {}; // <- No solution found
}
一些测试用例:
即使是问题集(4个项目的所有可能列表都在1..10范围内)是 足够小(10000项)由上面实现的强力算法解决。您 很容易发现,3项目列表中只能生成10000个4项4项目列表。