证明异或不适用于查找丢失的号码(面试问题)?



>面试问题:你会得到一个大约十亿个唯一数字的文件,每个数字都是一个 32 位的数量。查找不在文件中的数字。

当我接近这个问题时,我尝试了一些 3 位和 4 位数字的示例。对于我尝试的例子,我发现当我对一组数字进行 XOR 运算时,我得到了一个正确的答案:

a = [0,1,2] # missing 3
b = [1,2,3] # missing 0
c = [0,1,2,3,4,5,6] # missing 7
d = [0,1,2,3,5,6,7] # missing 4
functools.reduce((lambda x, y: x^y), a) # returns 3
functools.reduce((lambda x, y: x^y), b) # returns 0
functools.reduce((lambda x, y: x^y), c) # returns 7
functools.reduce((lambda x, y: x^y), d) # returns 4

但是,当我将其编码并提交时,它未能通过测试用例。

我的问题是:在面试环境中,我如何确定或排除这样的方法不是一个可行的解决方案?

在您的所有示例中,数组只缺少一个数字。这就是异或起作用的原因。尽量不要使用相同的属性进行测试。

对于问题本身,您可以通过取每个位的少数来构造一个数字。

编辑

为什么XOR在你的例子上工作:

当您对从 0 到 2^n - 1 的所有数字取异或时,结果为 0(每个位正好有 2^(n-1( '1'(。因此,如果您取出一个数字并取所有其他数字的 XOR,则结果是您取出的数字,因为将该数字的 XOR 与所有其余数字的结果一起取 XOR 需要为 0。

假设一个 64 位系统具有超过 4gb 的可用内存,我会将这些数字读入 32 位整数数组。然后我会循环浏览多达 32 次的数字。

类似于反向的"策划者"游戏,我会一点一点地构造一个缺失的数字。在每个循环中,我计算所有与比特匹配的数字,到目前为止我选择了0或1。然后我添加发生频率较低的位。一旦计数达到零,我就缺少一个数字。

例:

十进制/二进制中的数字是

1 = 01
2 = 10
3 = 11

有一个数字的最高有效位为 0,两个数字为 1。因此,我以 0 作为最高有效位。 下一轮,我必须匹配00和01。这立即导致 00 作为缺失数字。


另一种方法是使用随机数生成器。您有 50% 的机会发现一个不存在的数字作为第一次猜测。

反例证明:3^4^5^6=4。

最新更新