这里每行包含一个数字的位表示。这些数字来自1..N正好缺少一个数字。找到缺失数字的位表示。
面试官问我这个问题
我说:“我们可以找到给定数字的总和,并从前n个数字的总和中减去它(我们知道为(N *(N + 1))/ 2)”
他说,涉及从基地10改为基地2
你能否给我一个暗示我如何在不改变基础的情况下解决它?
答案 0 :(得分:9)
您可以将XOR
.. 0
范围内的所有数字N
加在一起,然后XOR
数组中的数字。结果将是缺失的数字。
说明: XOR
一个数字本身总是会导致零。上面的算法XOR
的每个数字恰好是两次,除了缺失的算法。丢失的数字将是XOR
- 只有零一次,所以结果将等于缺少的数字。
注意:面试官在需要转换基础以进行添加时是错误的:添加二进制数字很容易也很有趣 - 事实上,计算机一直这样做: - )
答案 1 :(得分:1)
你可以将这些数字混合在一起,并与1..n进行异或。数字以二进制形式存储的事实是一个很好的提示,BTW。
事实上,任何具有逆运算的交换运算符都应该有效,因为如果运算符是可交换的,则顺序无关紧要,因此它可以应用于您拥有的数字和1..n,差别是第一个一个不对数组中没有的数字进行操作。然后你可以使用它的逆来找到那个数字,你有两个结果。 SO +
和-
,*
和/
,XOR
和XOR
以及符合要求的所有其他运营商都应该在这里工作。< / p>