该题解采用位运算和计数的方法来找到只出现一次的元素。首先,创建一个长度为32的数组来统计每个整数的每一位上1出现的次数。接着,遍历输入数组,对每个数字,通过位运算统计其每一位的1的数量,并更新到计数数组中。由于除了一个元素之外,其他元素都出现三次,如果某位的计数能被3整除,则目标元素在该位为0;否则为1。最后,根据这些位的信息重构出只出现一次的数字。特别注意的是,对于32位整数的最高位(符号位),需要特殊处理,以区分正负数。
时间复杂度: O(n)
空间复杂度: O(1)
class Solution:
def singleNumber(self, nums: List[int]) -> int:
# 创建一个长度为32的数组以存储每位的1的计数
count = [0] * 32
for n in nums:
for i in range(32): # 遍历每个数字的每一位
count[i] += n & 1 # 计算当前最低位是否为1并累加到计数器
n >>= 1 # 右移数字,准备检查下一位
result = 0
for i in range(32): # 遍历每一位
if count[i] % 3 != 0: # 如果计数不是3的倍数,说明目标数字在这一位是1
if i == 31: # 对最高位进行符号位处理
result -= (1 << i)
else:
result = result | (1 << i) # 使用位或操作将结果中的相应位设为1
return result