给定一个“前n个”自然数数组,其中缺少一个元素和一个重复元素。找出两个数字

时间:2018-07-30 09:24:00

标签: arrays algorithm math numbers sequence

给出一个first n个自然数的数组,其中缺少一个元素,一个重复元素。找出两个数字。采访中有人问我这个问题。

例如,示例数组为

5, 2, 1, 4, 5
where n=5

给定数组的答案应为:

missing element = 3
duplicate element = 5

是否有可能在不迭代数组的情况下提出解决方案。

我能够提出一个复杂度为O(nlogn)的解决方案,而无需额外的空间。是否存在O(n)解决方案(没有额外的空间)?

1 个答案:

答案 0 :(得分:4)

假设您有数字1,...,n。现在,将它们的总和1 + 2 + ... + n表示为S。如果将缺失数表示为j,将重复数表示为k,则将得到修改后的总和S' = S - j + k,因此这是两个变量的一个等式。我们可以重复相同的过程,但是这次,将第二次幂相加,即S_2 = 1 + 4 + ... + n^2。对于缺少一个和一个重复编号的序列,结果将为S_2' = S_2 - j*j + k*k。这样我们就得到了两个关于两个变量的方程。

总共,我们有:

S'   = S   - j   + k
S_2' = S_2 - j*j + k*k

因此

k - j     = S'   - S   =: a
k*k - j*j = S_2' - S_2 =: b

我们引入了符号ab来简化表示法。 现在,k*k - j*j = (k - j)*(k + j),因此:

k - j     = a
k*k - j*j = a * (k + j) = b

对两个方程求和得出:

2*k = b/a + a
2*j = b/a - a

对于您的特定示例:

S   = 1 + 2 + 3 + 4  + 5  = 15
S_2 = 1 + 4 + 9 + 16 + 25 = 55

对于缺少一个元素和一个重复元素的系列:

S'   = 5  + 2 + 1 + 4  + 5  = 17
S_2' = 25 + 4 + 1 + 16 + 25 = 71

然后:

a = S'   - S   = 2
b = S_2' - S_2 = 16

因此:

2*k = 8 + 2 = 10
2*j = 8 - 2 = 6

给出:

k = 5, j = 3

在实践中(如@HermanTheGermanHesse所述),对于S以及S_2的{​​{1}}的多项式而言,人们可以获得封闭式expressions(因此称为Faulhaber的公式),即:nS = n*(n+1)/2。因此,只需遍历输入数据,累加S_2 = n*(n+1)*(2*n+1)/6S'并使用上面给出的S_2'k的公式就足够了……