返回
破解挑战:解密出现 3 次的数字,用算法直击靶心!
后端
2023-11-13 18:41:33
直面难题,迎接挑战:破解 "137. 只出现一次的数字 II" 算法
身处浩瀚的算法海洋中,你是否曾被 "137. 只出现一次的数字 II" 算法挑战所困扰?不必惊慌,这篇文章将成为你的终极航标,助你在这场算法对决中乘风破浪,直抵彼岸!我们将深入探究两种巧妙的方法,并辅以清晰的代码示例,让你在算法的征途中披荆斩棘,直击靶心!
一、哈希表法:高效定位目标数字
哈希表,一种巧夺天工的数据结构,以其闪电般的查找和插入速度闻名于算法界。借助哈希表的威力,我们可以轻松化解 "137. 只出现一次的数字 II" 的难题。
-
算法流程:
- 首先,我们创建一个哈希表,并初始化每个数字的出现次数为 0。
- 随后,我们逐一遍历给定的数字数组,对于每个数字:
- 如果它已经在哈希表中,则将它的出现次数加 1。
- 否则,将它添加到哈希表中,并将其出现次数设置为 1。
- 最后,我们遍历哈希表,找到出现次数为 1 的数字,并将其作为答案返回。
-
代码示例(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 的二进制位,这个二进制位将数字数组中的所有数字分成了两组。
- 最后,我们对每一组数字再次进行异或运算,即可得到出现一次的数字。
-
代码示例(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 的二进制位?
- 因为这个二进制位将数字数组中的所有数字分成了两组,只出现一次的数字一定在其中一组中。
-
位运算法中如何确定数字属于哪一组?
- 对于异或值中第一个为 1 的二进制位,如果数字的对应二进制位为 1,则它属于第一组;否则,它属于第二组。
-
哈希表法的空间复杂度和时间复杂度是多少?
- 空间复杂度为 O(n),其中 n 是数字数组的长度。时间复杂度为 O(n)。
-
位运算法的空间复杂度和时间复杂度是多少?
- 空间复杂度为 O(1),时间复杂度为 O(n)。