寻找独特数字|豆包MarsCode AI刷题

49 阅读3分钟

寻找独特数字:一个高效算法的探索

在一个班级中,每位同学都持有一张写有整数的卡片,而这些整数中,除了一个独特的数字之外,其余都恰好出现了两次。班长小C需要快速找出那个持有独特数字卡片的同学。为了完成这个任务,我们需要设计一个既高效又节省空间的算法。

思路解析

首先,我们需要明确问题的核心:在大量的重复数字中,如何快速且准确地定位到那个只出现一次的独特数字。考虑到题目对时间复杂度和空间复杂度的严格要求,我们需要一种既能快速处理数据又不需要额外大量存储空间的算法。

一个巧妙的思路是利用位运算中的异或(XOR)操作。异或运算有一个非常重要的性质:对于任何数x,都有x XOR x = 0,x XOR 0 = x。这意味着,如果我们将所有数字进行异或运算,那么成对出现的数字会相互抵消,而那个独特的数字则会因为找不到与之配对的数字而保留下来。

算法设计

基于上述思路,我们可以设计如下算法:

  1. 初始化一个变量unique为0,用于存储最终的独特数字。
  2. 遍历整个数组,对于数组中的每个数字num,都将其与unique进行异或运算,并将结果存回unique
  3. 遍历结束后,unique中存储的就是那个只出现一次的独特数字。

这个算法的时间复杂度是O(n),因为我们只需要遍历一次数组。而空间复杂度则是O(1),因为我们只需要一个额外的变量来存储结果。

图解与代码详解

假设我们有一个数组[2, 3, 2, 3, 4],其中4是那个独特的数字。

  • 初始化unique = 0
  • 第一次迭代:unique = 0 XOR 2 = 2
  • 第二次迭代:unique = 2 XOR 3 = 1(在二进制下,2是10,3是11,异或后为01,即1)。
  • 第三次迭代:unique = 1 XOR 2 = 3(在二进制下,1是01,2是10,异或后为11,即3)。
  • 第四次迭代:unique = 3 XOR 3 = 0
  • 第五次迭代:unique = 0 XOR 4 = 4

最终,unique的值就是4,也就是那个独特的数字。

下面是相应的Python代码实现:

python复制代码
	def find_unique_number(nums):

	    unique = 0

	    for num in nums:

	        unique ^= num

	    return unique

	 

	# 示例用法

	nums = [2, 3, 2, 3, 4]

	print(f"独特数字是: {find_unique_number(nums)}")

这段代码会输出“独特数字是: 4”,与我们的预期结果一致。

总结

通过利用异或运算的性质,我们成功设计出了一个既高效又节省空间的算法,用于找出那个只出现一次的独特数字。这个算法的时间复杂度为O(n),空间复杂度为O(1),完全符合题目的要求。同时,这种算法的实现也非常简洁明了,易于理解和应用。