请再阅读帖子
"Programming Pearls" binary search help中的答案。它解释了你所问的5个整数的过程。
思路是解析每个列表,并根据第一个位中的值将其分成两个(这就是二进制部分的来源)独立的列表。
即显示实际数字的二进制表示
原始列表:“001, 010, 110, 000, 100, 011, 101” => (分成)
(我们删除第一位并将其附加到新列表的“名称”)
为形成下面每个列表,我们从上面的列表中取值开始[0或1]
列表“0”:01、10、00、11(由列表“”中子集001、010、000、011形成,通过删除第一位并将其附加到新列表的“名称”)
列表“1”:10、00、01(由列表“”中子集110、100、101形成,通过删除第一位并将其附加到新列表的“名称”)
现在依次取其中一个结果列表并重复此过程:
列表“0”成为您的原始列表并将其分成
列表“0***0**”和
列表“0***1**”(粗体数字再次是正在分解的列表中剩余的1位)
继续执行直到最终得到空列表。
编辑
逐步处理:
列表“”:001、010、110、000、100、011、101 =>
列表“0”:01、10、00、11(从列表“”的子集001、010、000、011中获取)=>
列表“00”:1、0(从列表“0”的子集01、00中获取)=>
列表“000”:0 [最终结果](从列表“00”的子集0中获取)
列表“001”:1 [最终结果](从列表“00”的子集1中获取)
列表“01”:0、1(从列表“0”的子集10、11中获取)=>
列表“010”:0 [最终结果](从列表“01”的子集0中获取)
列表“011”:1 [最终结果](从列表“01”的子集1中获取)
列表“1”:10、00、01(从列表“”的子集110、100、101中获取)=>
列表“10”:0、1(从列表“1”的子集00、01中获取)=>
列表“100”:0 [最终结果](从列表“10”的子集0中获取)
列表“101”:1 [最终结果](从列表“10”的子集1中获取)
列表“11”:0(从列表“1”的子集10中获取)=>
列表“110”:0 [最终结果](从列表“11”的子集0中获取)
列表“111”:
缺席 [最终结果](从列表“11”的子集
空中获取)
这种方法的优点是它可以让你找到集合中任何数量的缺失数字 - 即使有多个缺失。
顺便说一句,如果完整范围内只有一个缺失数字,甚至还有更优雅的解决方案,即对所有数字执行XOR运算。
001 ^ 110 => 0
的结果... - Germann Arlington1 XOR 0 = 1
而不是1 XOR 0 = 0
? - Ynoa XOR b
仅在a
为真或b
为真时为真,而不是两者都为真。 - Yno