给出2n+1个非负整数元素的数组,除其中一个数字之外,其他每个数字均出现两次,找到这个数字。
给出[1,2,2,1,3,4,3],返回4。
使用异或运算(XOR)实现
def find_single_number(nums):
result = 0
for num in nums:
result ^= num
return result
# 测试示例
nums = [1, 2, 2, 1, 3, 4, 3]
result = find_single_number(nums)
print(result)
该算法的思路是,由于除了一个数字之外,其他数字都出现了两次,所以对数组中的所有数字进行异或运算,最后的结果就是那个只出现一次的数字。异或运算具有以下性质:
因此,将数组中的所有数字进行异或运算,最后得到的结果就是那个只出现一次的数字。
在示例中,数组 [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] += 1
else:
hash_table[num] = 1
for 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)。