【发布时间】: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)。