查找数组中恰好出现一次的两个元素
Find two elements in an array, which occurs exactly once
最近我接到了以下任务:
假设给定一个长度为 N 的元素数组,其中除了两个 special 之外的每个元素,出现一次,恰好出现两次。找到这个 特殊 号码。
我也知道数组中的每个元素都是非负的并且不超过 10^9 并且数组的长度 N 小于或等于 10 ^6
我认为解决方案是使用 xors。这是我的想法:
让我们对数组中的所有元素进行异或运算。因为 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. 请不要告诉我任何关于哈希表的事情。首先,我试过了,但没有用,因为我的哈希函数无法将所有数字范围压缩到任何合理大小的数组中(至少对我的机器而言)。二是任务条件禁止
编辑:我的错,我没有提到排序也是被禁止的。
异或的好方法。
试想一下 - 对所有元素进行异或运算的结果是什么?如您所写,所有成对元素都归零,因此结果为
R = A xor B
考虑结果 R
的 一位 - 我们可以看到它们对应于 [=12= 的 distinct 位] 和 B
.
所以我们可以选择 R
的任何 non-zero 位,并生成第二个 运行 - 但只有元素 具有此位 non-zero .
现在我们有了新结果 - 它等于或 A
B
。
计算第二个是初级的:B = R xor A
复杂度保持线性O(n)
最近我接到了以下任务:
假设给定一个长度为 N 的元素数组,其中除了两个 special 之外的每个元素,出现一次,恰好出现两次。找到这个 特殊 号码。
我也知道数组中的每个元素都是非负的并且不超过 10^9 并且数组的长度 N 小于或等于 10 ^6
我认为解决方案是使用 xors。这是我的想法:
让我们对数组中的所有元素进行异或运算。因为 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. 请不要告诉我任何关于哈希表的事情。首先,我试过了,但没有用,因为我的哈希函数无法将所有数字范围压缩到任何合理大小的数组中(至少对我的机器而言)。二是任务条件禁止
编辑:我的错,我没有提到排序也是被禁止的。
异或的好方法。
试想一下 - 对所有元素进行异或运算的结果是什么?如您所写,所有成对元素都归零,因此结果为
R = A xor B
考虑结果 R
的 一位 - 我们可以看到它们对应于 [=12= 的 distinct 位] 和 B
.
所以我们可以选择 R
的任何 non-zero 位,并生成第二个 运行 - 但只有元素 具有此位 non-zero .
现在我们有了新结果 - 它等于或 A
B
。
计算第二个是初级的:B = R xor A
复杂度保持线性O(n)