棘手的算法问题

时间:2010-10-28 07:43:03

标签: algorithm puzzle divide-and-conquer

  

可能重复:
  Quickest way to find missing number in an array of numbers

输入:未排序的数组A [1,..,n],其中包含0,...,n

范围内的除整数之外的所有整数

问题是在O(n)时间内确定缺失的整数。 A的每个元素都是 以二进制表示,唯一可用的操作是函数位(i,j),其中 返回A [i]的第j位的值并占用恒定时间。

有什么想法吗?我认为某种分而治之的算法是正确的,但我想不出我应该做些什么。提前谢谢!

3 个答案:

答案 0 :(得分:9)

这是一个数学属性,1n之间的数字之和nn(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

因此,通过扩展名,是0n的数字之和,因为您只是向它添加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得到了它,假设您被允许使用不使用位方法的解决方案。