【问题标题】:Given an array of `first n` natural numbers with one element missing and one duplicate element. Figure out both numbers [duplicate]给定一个包含“前 n”个自然数的数组,其中一个元素缺失和一个重复元素。找出两个数字[重复]
【发布时间】:2026-02-07 18:30:02
【问题描述】:

给定一个由first n 自然数组成的数组,其中一个元素缺失,一个元素重复。找出这两个数字。我在一次采访中被问到这个问题。

例如,样本数组是

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

给定数组的答案应该是:

missing element = 3
duplicate element = 5

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

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

【问题讨论】:

标签: arrays algorithm math numbers sequence


【解决方案1】:

假设您有号码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 所述),可以根据n 中的多项式(所谓的Faulhaber 公式)获得SS_2 的封闭形式expressions,即: S = n*(n+1)/2S_2 = n*(n+1)*(2*n+1)/6。因此只需遍历输入数据一次,累积S'S_2',并使用上面给出的kj 的公式...

【讨论】:

  • 来自here: S = (n(n+1))/2 S_2 = (n(n+1)(2n+1))/6 所以你不必计算它一步一步;)
  • @HermanTheGermanHesse 确实,这应该简化事情! :) 我会将其包含在答案中...
最近更新 更多