跳到主要内容

寻找乱序后的连续数字[ [ 1,N] ] 中缺失的数字/ / 数组中唯一的重 复数字 ?

参考答案:

要在乱序后的连续数字数组 [1, N] 中找出缺失的数字或唯一的重复数字,我们可以利用数组元素的和或异或运算的性质来解决这个问题。

方法1:利用元素和

如果数组中没有重复的数字,且 1N 的所有数字都恰好出现一次,那么这些数字的和应该是 (1 + N) * N / 2。因此,我们可以通过计算数组所有元素的和,然后减去这个理论值,来找出缺失或重复的数字。

具体步骤如下:

  1. 计算数组所有元素的和 sum_of_array
  2. 计算 (1 + N) * N / 2,记为 expected_sum
  3. 计算 diff = sum_of_array - expected_sum

如果 diff 为正,表示缺失的数字是 diff;如果 diff 为负,表示重复的数字是 -diff

方法2:利用异或运算

异或运算有一个重要的性质:任何数和 0 异或都等于它本身,任何数和其自身异或都等于 0。因此,如果我们对 1N 的所有数字进行异或运算,结果应该是 0

具体步骤如下:

  1. 初始化一个变量 xor_result0
  2. 遍历数组中的每个元素 num,将 xor_resultnum 进行异或运算,并更新 xor_result
  3. 如果数组中没有重复的数字,xor_result 将会是 0。此时,缺失的数字就是 xor_result
  4. 如果数组中有重复的数字,xor_result 将不会是 0。此时,xor_result 就是重复的数字。

示例代码(Python)

下面是两种方法的示例代码:

def find_missing_or_duplicated(nums):
    # 方法1:利用元素和
    sum_of_array = sum(nums)
    N = len(nums)
    expected_sum = (1 + N) * N // 2
    diff = sum_of_array - expected_sum
    if diff > 0:
        return diff
    else:
        return -diff

def find_missing_or_duplicated_xor(nums):
    # 方法2:利用异或运算
    xor_result = 0
    for i in range(1, len(nums) + 1):
        xor_result ^= i
    for num in nums:
        xor_result ^= num
    return xor_result

# 示例
nums = [3, 4, 2, 1, 5]  # 缺失的数字是 0,重复的数字是 3
print(find_missing_or_duplicated(nums))  # 输出 0 或 3
print(find_missing_or_duplicated_xor(nums))  # 输出 0 或 3

注意:这两种方法都假设数组中只有一个数字是缺失或重复的。如果数组中有多个数字缺失或重复,这些方法可能无法正确找出所有缺失或重复的数字。