📅  最后修改于: 2023-12-03 15:12:46.040000             🧑  作者: Mango
这是一道面试题,被称为“门|门 CS 1997 |问题 23”,常常出现在各类程序员的笔试和面试中。下面将详细介绍这道题目和解题思路。
给定一个整数数组 nums
,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。 要求时间复杂度是 O(n)
,空间复杂度是 O(1)
。
这道题目中有两个元素只出现一次,我们可以利用异或运算先将所有元素进行异或操作,得到的结果是只出现一次的两个元素的异或结果 xor
。
若 a
和 b
是只出现一次的两个元素,则 a
和 b
的二进制表示中,至少在一位上不同。因此,我们可以从 xor
的二进制表示中找到任意一位为 1 的位,根据该位对所有的元素进行分组,分成两个组,使得每个组内只包含一个只出现一次的元素,而其他元素都成对出现两次。
这样,问题就被转化成两个单独的、类似于“只出现一次的数字”的问题了,我们只需要在每个组内分别进行异或操作,得到的结果就是只出现一次的元素。
下面是用 Python 语言实现的代码片段。需要注意的是,代码片段只实现了找到只出现一次的两个元素的过程,具体实现用的是异或运算的方法。
class Solution:
def singleNumber(self, nums: List[int]) -> List[int]:
xor = 0
# 将所有元素进行异或操作
for num in nums:
xor ^= num
# 找到任意一个二进制位为 1 的位
bit = 1
while xor & bit == 0:
bit <<= 1
# 将所有元素按照该位是否为 1 分成两个组,并分别进行异或操作
a = b = 0
for num in nums:
if num & bit == 0:
a ^= num
else:
b ^= num
return [a, b]
注意,在返回结果前,我们需要将结果以列表的形式返回。
这道题目中,我们主要是利用异或运算找到只出现一次的两个元素,然后分组分别进行异或操作,得到最终的结果。这种思想在实际的开发中很常见,可以解决很多类似于“只出现一次的数字”这样的问题。