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

44 阅读3分钟

问题描述

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

要求:

  1. 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
  2. 尽量减少额外空间的使用,以体现你的算法优化能力。

测试样例

样例1:

输入:cards = [1, 1, 2, 2, 3, 3, 4, 5, 5]
输出:4
解释:拿到数字 4 的同学是唯一一个没有配对的。

样例2:

输入:cards = [0, 1, 0, 1, 2]
输出:2
解释:数字 2 只出现一次,是独特的卡片。

样例3:

输入:cards = [7, 3, 3, 7, 10]
输出:10
解释:10 是班级中唯一一个不重复的数字卡片。

约束条件

  • 1 ≤ cards.length ≤ 1001
  • 0 ≤ cards[i] ≤ 1000
  • 班级人数为奇数
  • 除了一个数字卡片只出现一次外,其余每个数字卡片都恰好出现两次 要解决这个问题,我们可以使用异或(XOR)操作。异或操作具有以下性质:
  1. 任何数与自身异或结果为0。
  2. 任何数与0异或结果为该数本身。
  3. 异或操作是可交换的,即 𝑎⊕𝑏=𝑏⊕𝑎a⊕b=b⊕a。
  4. 异或操作是可结合的,即 (𝑎⊕𝑏)⊕𝑐=𝑎⊕(𝑏⊕𝑐)(a⊕b)⊕c=a⊕(b⊕c)。 解决代码:

使用异或运算

def solution(inp):
result = 0
for p in inp:
    result ^= p
return result
print("Unique number in the first test case is:", solution([1, 1, 2, 2, 3, 3, 4, 5, 5]))  # 应该输出 4
print("Unique number in the second test case is:", solution([0, 1, 0, 1, 2]))  # 应该输出 2
print("Unique number in the third test case is:", solution([7, 3, 3, 7, 10]))  # 应该输出 10

代码解读

  1. def solution(inp): 定义了一个名为 solution 的函数,它接受一个参数 inp,这是一个整数列表,代表班级中每位同学拿到的卡片上的数字。
  2. result = 0 初始化一个变量 result,它将用来存储最终的结果,即那个只出现一次的数字。
  3. for p in inp: 这是一个循环,遍历输入列表 inp 中的每个元素。
  4. result ^= p 在循环中,使用异或运算符 ^ 将当前元素 presult 进行异或操作,并将结果赋值回 result。异或运算的性质使得任何数字与自身异或结果为0,任何数字与0异或结果为该数字本身。
  5. return result 在循环结束后,返回 result 变量的值,它就是那个只出现一次的数字。
  6. print("Unique number in the first test case is:", solution([1, 1, 2, 2, 3, 3, 4, 5, 5])) 这是第一个测试用例,调用 solution 函数并传入一个列表 [1, 1, 2, 2, 3, 3, 4, 5, 5],预期输出是 4,因为 4 是列表中唯一一个只出现一次的数字。
  7. print("Unique number in the second test case is:", solution([0, 1, 0, 1, 2])) 这是第二个测试用例,调用 solution 函数并传入列表 [0, 1, 0, 1, 2],预期输出是 2,因为 2 是列表中唯一一个只出现一次的数字。
  8. print("Unique number in the third test case is:", solution([7, 3, 3, 7, 10])) 这是第三个测试用例,调用 solution 函数并传入列表 [7, 3, 3, 7, 10],预期输出是 10,因为 10 是列表中唯一一个只出现一次的数字。

这个算法的时间复杂度是 O(n),因为它只需要遍历一次列表。空间复杂度是 O(1),因为它只使用了一个额外的变量 result 来存储结果,没有使用其他依赖于输入大小的空间。这个解决方案满足了题目的要求,即时间复杂度为 O(n) 且尽量减少额外空间的使用。