返回

破解挑战:解密出现 3 次的数字,用算法直击靶心!

后端

直面难题,迎接挑战:破解 "137. 只出现一次的数字 II" 算法

身处浩瀚的算法海洋中,你是否曾被 "137. 只出现一次的数字 II" 算法挑战所困扰?不必惊慌,这篇文章将成为你的终极航标,助你在这场算法对决中乘风破浪,直抵彼岸!我们将深入探究两种巧妙的方法,并辅以清晰的代码示例,让你在算法的征途中披荆斩棘,直击靶心!

一、哈希表法:高效定位目标数字

哈希表,一种巧夺天工的数据结构,以其闪电般的查找和插入速度闻名于算法界。借助哈希表的威力,我们可以轻松化解 "137. 只出现一次的数字 II" 的难题。

  1. 算法流程:

    • 首先,我们创建一个哈希表,并初始化每个数字的出现次数为 0。
    • 随后,我们逐一遍历给定的数字数组,对于每个数字:
      • 如果它已经在哈希表中,则将它的出现次数加 1。
      • 否则,将它添加到哈希表中,并将其出现次数设置为 1。
    • 最后,我们遍历哈希表,找到出现次数为 1 的数字,并将其作为答案返回。
  2. 代码示例(Python):

def single_number(nums):
    hashtable = {}
    for num in nums:
        if num in hashtable:
            hashtable[num] += 1
        else:
            hashtable[num] = 1
    for num, count in hashtable.items():
        if count == 1:
            return num

二、位运算法:巧用二进制的奥秘

位运算法,一种算法世界的魔术师,它巧妙地操纵着二进制数据的奥秘。利用位运算法,我们可以轻而易举地解开 "137. 只出现一次的数字 II" 的谜题。

  1. 算法流程:

    • 首先,我们对给定数字数组中的所有数字进行异或运算。异或运算的结果只保留了出现奇数次的数字(只出现一次或三次)。
    • 随后,我们找到异或值中第一个为 1 的二进制位,这个二进制位将数字数组中的所有数字分成了两组。
    • 最后,我们对每一组数字再次进行异或运算,即可得到出现一次的数字。
  2. 代码示例(Python):

def single_number(nums):
    xor_result = 0
    for num in nums:
        xor_result ^= num
    
    # 找到异或值中第一个为 1 的二进制位
    mask = 1
    while xor_result & mask == 0:
        mask <<= 1
    
    # 将数字数组分组,并对每组数字进行异或运算
    group1 = []
    group2 = []
    for num in nums:
        if num & mask:
            group1.append(num)
        else:
            group2.append(num)
    
    xor_result = 0
    for num in group1:
        xor_result ^= num
    
    return xor_result

终结难题,直击靶心!

掌握了这两种方法,你已经具备了破解 "137. 只出现一次的数字 II" 算法挑战的超能力。立即行动起来,在算法的世界中大显身手,直击靶心!

常见问题解答:

  1. 哈希表法和位运算法哪个更好?

    • 哈希表法更易于理解和实现,而位运算法在性能上略有优势。
  2. 位运算法中为什么要找到异或值中第一个为 1 的二进制位?

    • 因为这个二进制位将数字数组中的所有数字分成了两组,只出现一次的数字一定在其中一组中。
  3. 位运算法中如何确定数字属于哪一组?

    • 对于异或值中第一个为 1 的二进制位,如果数字的对应二进制位为 1,则它属于第一组;否则,它属于第二组。
  4. 哈希表法的空间复杂度和时间复杂度是多少?

    • 空间复杂度为 O(n),其中 n 是数字数组的长度。时间复杂度为 O(n)。
  5. 位运算法的空间复杂度和时间复杂度是多少?

    • 空间复杂度为 O(1),时间复杂度为 O(n)。