可能重复:
Quickest way to find missing number in an array of numbers
输入:未排序的数组A [1,..,n],其中包含0,...,n
范围内的除整数之外的所有整数问题是在O(n)时间内确定缺失的整数。 A的每个元素都是 以二进制表示,唯一可用的操作是函数位(i,j),其中 返回A [i]的第j位的值并占用恒定时间。
有什么想法吗?我认为某种分而治之的算法是正确的,但我想不出我应该做些什么。提前谢谢!
答案 0 :(得分:9)
这是一个数学属性,1
和n
之间的数字之和n
为n(n+1)/2
。您可以看到10
:
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
= (1+10) + (2+9) + (3+8) +(4+7) + (5+6)
= 11 + 11 + 11 + 11 + 11
= 55
因此,通过扩展名,是0
到n
的数字之和,因为您只是向它添加0。所以你要做的就是将所有数字相加并保持计数,然后使用该公式计算出缺失的数字。
所以,比如:
count = 0
sum = 0
foreach num in list:
sum = sum + num
count = count + 1
missing = count * (count+1) / 2 - sum
使用bit(i,j)
获取数字非常棘手,因此您必须单独提取这些位并将其转换为实际数字以进行求和。
答案 1 :(得分:6)
您可以使用XOR运算符,因为它比添加更快。由于您可以访问每个位,因此您将在此处执行按位异或。 这里使用的原则是(A XOR B XOR A)= B
例如:(1 XOR 2 XOR 3)XOR(1 XOR 2)= 3
for i=0 to n
{
Total=Total XOR i
}
foreach element in A
{
Total=Total XOR element
}
答案 2 :(得分:0)
这是一个技巧问题,因为使用位方法只需要为每个数字循环每个位,这意味着它将自动变为O(n * j),其中j是表示n的位数。
我认为paxdiablo得到了它,假设您被允许使用不使用位方法的解决方案。