【问题标题】:Given 2 arrays, returns elements that are not included in both arrays给定 2 个数组,返回两个数组中都不包含的元素
【发布时间】:2014-12-03 21:13:24
【问题描述】:

我进行了一次面试,并做了以下描述的问题之一:

给定两个数组,请计算结果:得到并集,然后从并集中删除交集。例如

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. 使用a 中的“二分法搜索”检查b 的每一项。如果没有找到,通过。否则,从ab 中删除此项
  3. 结果 = a 中剩余的元素 + b 中剩余的元素

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

【问题讨论】:

  • “二分法搜索” - 你的意思是二分法搜索?
  • 寻找std::set_difference 实现,它的C++,但你可以理解
  • 假设数组 a 有 n 个元素,b 有 m 个元素...听起来不错,排序给你 O(nlogn) + 搜索每个元素是 O(nlogn) + 生成结果数组是 O (n+m) 的总复杂度为 O(nlogn)(或 O(mlogm),具体取决于 n
  • @P0W std::set_symmetric_difference 可能更好。
  • 排序后,认为修改后的合并与mergesort一样。

标签: algorithm language-agnostic


【解决方案1】:

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

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.

【讨论】:

    【解决方案2】:

    另一种方法可能是:

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

    这有一个缺点:如果输入列表已经有双拼,它就不起作用。但由于我们谈论的是集合和集合论,所以我也希望输入是数学意义上的集合。

    【讨论】:

      【解决方案3】:

      另一种(我认为最好的)方法:

      您不需要搜索这两个列表。您可以按顺序遍历它们:

      • 排序 a 和 b
      • 声明一个空的结果集
      • 对两个列表都使用迭代器并重复以下步骤:
        • 如果迭代器值不相等:
          将较小的数字添加到结果集中并递增所属的迭代器
        • 如果迭代器值相等:
          增加两个迭代器而不向结果集添加任何内容
        • 如果一个迭代器到达末尾:
          将另一个集合的所有剩余元素添加到结果中

      【讨论】:

        猜你喜欢
        • 2019-11-06
        • 1970-01-01
        • 1970-01-01
        • 2019-09-19
        • 2017-03-13
        • 2020-10-27
        • 2017-01-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多