寻找乱序后的连续数字[ [ 1,N] ] 中缺失的数字/ / 数组中唯一的重 复数字 ?
参考答案:
要在乱序后的连续数字数组 [1, N]
中找出缺失的数字或唯一的重复数字,我们可以利用数组元素的和或异或运算的性质来解决这个问题。
方法1:利用元素和
如果数组中没有重复的数字,且 1
到 N
的所有数字都恰好出现一次,那么这些数字的和应该是 (1 + N) * N / 2
。因此,我们可以通过计算数组所有元素的和,然后减去这个理论值,来找出缺失或重复的数字。
具体步骤如下:
- 计算数组所有元素的和
sum_of_array
。 - 计算
(1 + N) * N / 2
,记为expected_sum
。 - 计算
diff = sum_of_array - expected_sum
。
如果 diff
为正,表示缺失的数字是 diff
;如果 diff
为负,表示重复的数字是 -diff
。
方法2:利用异或运算
异或运算有一个重要的性质:任何数和 0
异或都等于它本身,任何数和其自身异或都等于 0
。因此,如果我们对 1
到 N
的所有数字进行异或运算,结果应该是 0
。
具体步骤如下:
- 初始化一个变量
xor_result
为0
。 - 遍历数组中的每个元素
num
,将xor_result
与num
进行异或运算,并更新xor_result
。 - 如果数组中没有重复的数字,
xor_result
将会是0
。此时,缺失的数字就是xor_result
。 - 如果数组中有重复的数字,
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
注意:这两种方法都假设数组中只有一个数字是缺失或重复的。如果数组中有多个数字缺失或重复,这些方法可能无法正确找出所有缺失或重复的数字。