给定2个数组,返回两个数组中都不包含的元素

时间:2014-10-09 03:43:53

标签: algorithm language-agnostic

我接受了一次采访,并做了下面提到的一个问题:

给定两个数组,请计算结果:获取联合,然后从联合中删除交集。 e.g。

int a[] = {1, 3, 4, 5, 7};
int b[] = {5, 3, 8, 10}; // didn't mention if has the same value.

result = {1,4,7,8,10}

这是我的想法:

  1. 排序ab
  2. 使用'二分搜索'检查b的每个项目。在a。如果没有找到,请通过。否则,请从ab
  3. 中删除此项
  4. result =留在a
  5. b +元素中的元素

    我知道这是一个糟糕的算法,但它总比没有好。有比这更好的方法吗?

3 个答案:

答案 0 :(得分:0)

有很多方法可以解决这个问题。一种方法是:

1. construct hash-map using distinct array elements of array a with elements as keys and 1 is a value.
2. for every element,e in array b
   if e in hash-map
      set value of that key to 0
   else
     add e to result array.
3.add all keys from hash-map whose values 1 to result array.

答案 1 :(得分:0)

另一种方法可能是:

  • 加入两个列表
  • 对加入列表进行排序
  • 浏览联接列表并完全删除多次出现的任何元素

这有一个缺点:如果输入列表已经有双联,它就不起作用。但是既然我们在讨论集合和集合理论,我也希望输入是数学意义上的集合。

答案 2 :(得分:0)

另一种(在我看来是最好的)方法:

您不需要搜索两个列表。你可以按顺序迭代它们:

  • 排序a和b
  • 声明一个空结果集
  • 将迭代器带到两个列表并重复以下步骤:
    • 如果迭代器值不相等:
      将较小的数字添加到结果集并增加归属迭代器
    • 如果迭代器值相等:
      增加两个迭代器而不向结果集添加内容
    • 如果一个迭代器到达结束:
      将另一组的所有剩余元素添加到结果