给出4个1到10个元素的数组。找到3个数字,其总和可以生成所有四个数字?

时间:2013-07-18 10:06:49

标签: arrays random numbers puzzle

我得到一个包含4个随机数列表(1到10)的数组。我应该生成一个包含3个数字(包括1到10)的列表,这样我就可以通过添加生成列表的3个数字来生成初始列表的所有4个数字。

有人请提供执行此操作的算法。

1 个答案:

答案 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
}

一些测试用例:

  1. BruteForce(new int [] {1,3,7,8}}; //&lt; - [1,2,5]
  2. BruteForce(new int [] {1,3,7,9}}; //&lt; - [1,2,6]
  3. BruteForce(new int [] {1,6,7,9}}; //&lt; - [1,2,6];与之前的案例相同
  4. BruteForce(new int [] {4,6,7,9}}; //&lt; - [1,3,6]
  5. BruteForce(new int [] {5,6,7,9}}; //&lt; - [2,3,4]
  6. BruteForce(new int [] {1,2,4,8}); //&lt; - 找不到解决方案
  7. 即使是问题集(4个项目的所有可能列表都在1..10范围内)是 足够小(10000项)由上面实现的强力算法解决。您 很容易发现,3项目列表中只能生成10000个4项4项目列表。