algorithm - 证明 XOR 不适用于查找丢失的数字(面试问题)?

标签 algorithm bit-manipulation

面试问题:你得到了一个包含大约 10 亿个唯一数字的文件,每个数字都是一个 32 位数字。找到一个不在文件中的数字。

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

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 起作用的原因。尽量不要使用相同的属性进行测试。

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

编辑

为什么 XOR 对您的示例有效:

当您对从 0 到 2^n - 1 的所有数字进行异或运算时,结果为 0(每个位正好有 2^(n-1) 个“1”)。因此,如果您取出一个数字并与其余所有数字进行异或,结果就是您取出的数字,因为该数字与其余所有数字的异或结果需要为 0。

关于algorithm - 证明 XOR 不适用于查找丢失的数字(面试问题)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57789355/

相关文章:

java - 将 List<Map<String, List<String>>> 转换为 String[][]

algorithm - 需要一种将网络 block 范围折叠成超集范围列表的算法

java - 如何在 Java 中创建 32 位掩码

javascript - 按位或意外结果

c++ - 为什么是0x7FFFFFFFull | (1 << 31) 在 C++ 中返回 0xFFFFFFFFFFFFFFFF?

c - Qsort() 不适用于结构

组内不重复的SQL随机数

algorithm - 如果匹配模式,则删除文件中的第一行

c++ - 如何将数字 0-8 转换为 C++ 中的二进制第 0-8 位?

algorithm - 使用无限内存的 K&R 方法计算位数