第一篇找单独的数|豆包MarsCode AI 刷题

34 阅读3分钟

在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。

要求:

  1. 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
  2. 尽量减少额外空间的使用,以体现你的算法优化能力。
  • 1 ≤ cards.length ≤ 1001
  • 0 ≤ cards[i] ≤ 1000
  • 班级人数为奇数
  • 除了一个数字卡片只出现一次外,其余每个数字卡片都恰好出现两次

思路: 可以使用异或运算的特性,即相同的数字异或结果为 0,不同的数字异或结果为其本身。将所有数字依次进行异或运算,最终结果就是那个只出现一次的数字。 定义一个 find_unique_number 函数,它接受一个数字列表 numbers 作为输入。首先,将 result 初始化为 0,然后遍历列表中的每个数字,将其与 result 进行异或操作。由于异或运算的特性,相同的数字会相互抵消,最终剩下的就是只出现一次的数字。最后,通过调用该函数并传入一个示例列表,打印出结果。

解释:

  • result = 0:将结果初始化为 0,因为 0 与任何数异或都等于该数本身。

  • for num in numbers::遍历输入的数字列表。

  • result ^= num:将当前数字与 result 进行异或操作,存储结果到 result 中。

  • 代码已经比较简洁,时间复杂度为 O(n)O(n),空间复杂度为 O(1)O(1),满足题目要求。如果要进一步优化,可以考虑使用位运算的其他特性,但对于本题来说,上述代码已经是最优解。

AI还提供了另一种方法 可以使用集合(Set)来解决这个问题。首先,创建一个空集合,遍历数字列表,对于每个数字,如果它不在集合中,就将其添加到集合中;如果它已经在集合中,就将其从集合中移除。最终集合中剩下的那个元素就是只出现一次的数字。

  • 虽然这个方法也能解决问题,但时间复杂度是 O(n)O(n),空间复杂度是 O(k)O(k),其中 kk 是不同数字的数量。相比使用异或运算的方法,空间复杂度稍高,因为需要存储不同的数字。如果对空间复杂度要求严格,还是使用异或运算的方法更好。

一些代码的运用:

  • num_set = set():创建一个空的集合。
  • for num in numbers::遍历输入的数字列表。
  • if num in num_set::如果数字已经在集合中,将其从集合中移除。
  • else::如果数字不在集合中,将其添加到集合中。
  • return num_set.pop():最终集合中只会剩下一个元素,将其弹出并返回。