1. 问题描述
给出2n+1个非负整数元素的数组,除其中一个数字之外,其他每个数字均出现两次,找到这个数字。
2. 问题示例
给出[1,2,2,1,3,4,3],返回4。
3. 代码实现
使用异或运算(XOR)实现
def find_single_number(nums):result = 0for num in nums:result ^= numreturn result# 测试示例
nums = [1, 2, 2, 1, 3, 4, 3]
result = find_single_number(nums)
print(result)
该算法的思路是,由于除了一个数字之外,其他数字都出现了两次,所以对数组中的所有数字进行异或运算,最后的结果就是那个只出现一次的数字。异或运算具有以下性质:
- 任何数与 0 进行异或运算,结果仍然是该数本身。
- 任何数与自身进行异或运算,结果为 0。
因此,将数组中的所有数字进行异或运算,最后得到的结果就是那个只出现一次的数字。
在示例中,数组 [1, 2, 2, 1, 3, 4, 3] 中所有数字进行异或运算的结果为 4,即为只出现一次的数字。
使用哈希表实现
def find_single_number(nums):hash_table = {}for num in nums:if num in hash_table:hash_table[num] += 1else:hash_table[num] = 1for num, count in hash_table.items():if count == 1:return num# 测试示例
nums = [1, 2, 2, 1, 3]
result = find_single_number(nums)
print(result)
该算法的思路是,使用哈希表记录每个数字出现的次数,然后遍历哈希表找到只出现一次的数字。
在示例中,数组 [1, 2, 2, 1, 3] 中数字 3 只出现了一次,因此返回结果为 3。相比于异或运算的方法,使用哈希表的方法需要额外的空间来存储哈希表,但时间复杂度相同,都为 O(n)。
使用数学方法实现
def find_single_number(nums):return 2 * sum(set(nums)) - sum(nums)# 测试示例
nums = [1, 2, 2, 1, 3, 4, 3]
result = find_single_number(nums)
print(result)
该算法的思路是,先将数组中的所有数字去重得到不重复的数字集合,然后将集合中的数字乘以 2,再减去数组中所有数字的和,最终得到的结果就是只出现一次的数字。
在示例中,数组 [1, 2, 2, 1, 3, 4, 3] 中数字 4 只出现了一次,因此返回结果为 4。相比于异或运算和哈希表的方法,使用数学方法的代码更简洁,但是需要进行额外的数学计算,可能会有一定的精度误差。。
使用集合方法实现
def find_single_number(nums):num_set = set()for num in nums:if num in num_set:num_set.remove(num)else:num_set.add(num)return num_set.pop()# 测试示例
nums = [1, 2, 2, 1, 3, 4, 3]
result = find_single_number(nums)
print(result)
该算法的思路是,使用一个集合来存储出现过一次的数字,遍历数组中的每个数字,如果数字已经在集合中存在,则从集合中移除;否则,将数字添加到集合中。最后,集合中剩下的元素就是只出现一次的数字。
在示例中,数组 [1, 2, 2, 1, 3, 4, 3] 中数字 4 只出现了一次,因此返回结果为 4。相比于其他方法,使用集合的方法不需要进行额外的位运算或数学计算,空间复杂度为 O(n),时间复杂度也为 O(n)。