返回
洞悉数学之美,解析 LeetCode 37:只出现一次的数字,让你眼前一亮!
前端
2024-02-11 12:23:47
前言
欢迎来到【小Y学算法】系列文章的第四篇,今天我们聚焦 LeetCode 37:只出现一次的数字。这是一个经典的算法问题,也是面试官们经常会问到的题目。我们将在本文中介绍两种解题方法:一种是基于哈希表的简单解法,另一种是利用异或运算的特性实现的优化解法。
题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现一次的数字。
示例
示例 1:
输入:nums = [2,2,1]
输出:1
示例 2:
输入:nums = [4,1,2,1,2]
输出:4
示例 3:
输入:nums = [1]
输出:1
思路分析
对于第一个解法,我们可以使用哈希表来记录数组中出现的数字和其出现的次数。然后遍历整个数组,如果某个数字只出现了一次,那么将其作为答案返回。
对于第二个解法,我们可以利用异或运算的特性来解决这个问题。异或运算具有交换律和结合律,并且对于任何数字 x,x XOR x 等于 0。这意味着如果我们将数组中的所有数字进行异或运算,那么结果将等于只出现一次的数字。
代码实现
# 方法一:哈希表
def singleNumber(nums):
hashtable = {}
for num in nums:
if num not in hashtable:
hashtable[num] = 1
else:
hashtable[num] += 1
for num, count in hashtable.items():
if count == 1:
return num
# 方法二:异或运算
def singleNumber(nums):
result = 0
for num in nums:
result ^= num
return result
时间复杂度
对于第一个解法,时间复杂度为 O(n),其中 n 是数组的长度。对于第二个解法,时间复杂度为 O(n)。
空间复杂度
对于第一个解法,空间复杂度为 O(n),因为我们需要使用哈希表来存储数组中的数字和其出现的次数。对于第二个解法,空间复杂度为 O(1),因为我们只需要使用一个变量来存储异或运算的结果。
总结
在本文中,我们介绍了两种解题方法来解决 LeetCode 37:只出现一次的数字。第一种方法是基于哈希表的简单解法,第二种方法是利用异或运算的特性实现的优化解法。希望大家通过本文能够对该算法题有更深入的了解。