返回

洞悉数学之美,解析 LeetCode 37:只出现一次的数字,让你眼前一亮!

前端

前言
欢迎来到【小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:只出现一次的数字。第一种方法是基于哈希表的简单解法,第二种方法是利用异或运算的特性实现的优化解法。希望大家通过本文能够对该算法题有更深入的了解。