[英]Removing even/odd numbers to find missing number in an array of array of numbers represented in binary
这与第5版《破解编码面试》中的问题5.7(在位操作下)有关(如果is问题不适用于SO,请让我知道正确的位置,然后我将其移动):
数组A [1..n]包含从0到n的所有整数,但缺少一个数字。 在此问题中,我们无法通过单个操作访问A中的整个整数。 A的元素以二进制表示,我们可以用来访问它们的唯一操作是“获取A [i]的第j位”,这需要固定的时间。 编写代码以查找丢失的整数。 你能在O(n)时间内完成吗?
应用的算法是这样的:
有人可以解释步骤3背后的逻辑吗? 基本上,它会从当前列表中删除所有奇/偶数(取决于找到丢失数字的位),并在下一次迭代中使用修改后的列表。 我们为什么要做这个?
第3步旨在(极大地)改善算法的运行时间。 如果包括步骤3,则整个算法是使用LSB作为分支决策器的二进制搜索算法。 如果省略了步骤3,则它仍然是二进制搜索,但是实现的方式不会在每次遍历中对数变快(这将超过O(n)界限)。
顺便提一句,正如所写的那样,似乎有点移位,或者术语LSB的使用相当自由。
该算法不起作用。 如果数组中元素的数量为偶数,则步骤2可以找到相等的0和1。 例如,当缺失的数字在范围的一端或另一端时,可能会发生这种情况。
如果数组中的元素数不偶数,它将在步骤3之后的下一次迭代中。
附录
这是一个例子。
设置:0、1、3
在步骤1&2之后,我们有1 LSB = 0和2 LSB = 1。 因此,根据步骤2,LSB必须为0。到目前为止,还不错。
第3步之后,从LBS = 1的集合中删除值,我们得到:
设定:0
在步骤1&2之后,我们有1 LSB'= 0和0 LSB'= 1。 因此,根据步骤2,LSB'必须为1。
至此,我们完成了(删除了LSB'= 0的元素后该集合为空),并已将2标识为答案(LSB'= 1,LBS = 0)。
这是如何运作的?
每次迭代后,请考虑将数组中的值右移一位以放弃在上一次迭代中确定的位。 这将在数组中为所有值(缺少的值除外)创建重复项。 该算法只是丢弃这些重复项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.