【问题标题】:Find two elements in an array, which occurs exactly once在数组中查找两个元素,该元素恰好出现一次
【发布时间】:2020-10-21 07:31:40
【问题描述】:

最近我被分配了以下任务:

假设给定一个长度为 N 的元素数组,其中除了出现一次的两个 special 之外的每个元素都恰好出现两次。找到这个特殊号码。

我也知道数组中的每个元素都是非负的并且不超过10^9并且数组的长度N小于等于10^6

我认为解决方案是使用异或。这是我的想法:

让我们对数组中的所有元素进行异或。由于 xor 是可交换的,例如xor(a, b)=xor(b, a),我们可以得出结论,所有出现两次的元素都将归零:

xor(a, b, a, c)=xor(a, a, b, c)=xor(xor(a, a), b, c)=xor(0, b, c)=xor( b, c)

然后对整个数组进行异或运算,我们将得到两个 special 元素的异或。接下来做什么?也许,其他一些解决方案?

P.S. 请不要告诉我有关哈希表的任何事情。首先,我已经尝试过了,但它不起作用,因为我的哈希函数无法将所有数字范围压缩成任何合理大小的数组(至少对于我的机器而言)。其次,任务条件禁止。

编辑:我的错,我没有提到 sorted 也是被禁止的。

【问题讨论】:

  • 要做的第 0 件事:对数组进行排序
  • O(NlogN)中排序,然后迭代找到O(N)中的两个唯一值。
  • 可以创建一个特殊的排序函数来检查是否相等并以某种方式停止排序过程:)
  • XOR 只是一个实现细节,并不会产生任何影响,因为您不妨使用比较。顺便说一句,xor 正好需要 2 个参数,所以你的伪代码甚至没有任何意义。
  • 散列当然不能解决问题。首先,它的内存复杂度将远大于排序(9B vs 6M)。其次,您仍然必须在最后迭代整个哈希表,因此即使运行时复杂度也会更高(9B 对 ~138M)。

标签: c algorithm xor


【解决方案1】:

Xoring 很好。

试想一下 - 异或所有元素的结果是什么?正如你所写,所有配对元素都归零,所以结果是

 R = A xor B

考虑结果R一位 - 我们可以看到它们对应于AB不同位。

所以我们可以选择R 的任何非零位,并进行第二次运行 - 但只能异或该位非零的元素。

现在我们有了新结果 - 它等于或 AB

计算第二个是基本的:B = R xor A

复杂性保持线性O(n)

【讨论】:

  • 绝对精彩。在实践中,这当然不是一个“任务”,而是一个面试问题,在面试中,如果有人使用哈希表来查找出现奇数个的 所有项,我会很高兴。次。例如,也不能用于字符串。
猜你喜欢
  • 1970-01-01
  • 2020-02-16
  • 2020-10-09
  • 2023-02-24
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
相关资源
最近更新 更多