问题描述
在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。
要求:
- 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
- 尽量减少额外空间的使用,以体现你的算法优化能力。
测试样例
样例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)操作。异或操作具有以下性质:
- 任何数与自身异或结果为0。
- 任何数与0异或结果为该数本身。
- 异或操作是可交换的,即 𝑎⊕𝑏=𝑏⊕𝑎a⊕b=b⊕a。
- 异或操作是可结合的,即 (𝑎⊕𝑏)⊕𝑐=𝑎⊕(𝑏⊕𝑐)(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
代码解读
def solution(inp):定义了一个名为solution的函数,它接受一个参数inp,这是一个整数列表,代表班级中每位同学拿到的卡片上的数字。result = 0初始化一个变量result,它将用来存储最终的结果,即那个只出现一次的数字。for p in inp:这是一个循环,遍历输入列表inp中的每个元素。result ^= p在循环中,使用异或运算符^将当前元素p与result进行异或操作,并将结果赋值回result。异或运算的性质使得任何数字与自身异或结果为0,任何数字与0异或结果为该数字本身。return result在循环结束后,返回result变量的值,它就是那个只出现一次的数字。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是列表中唯一一个只出现一次的数字。print("Unique number in the second test case is:", solution([0, 1, 0, 1, 2]))这是第二个测试用例,调用solution函数并传入列表[0, 1, 0, 1, 2],预期输出是2,因为2是列表中唯一一个只出现一次的数字。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) 且尽量减少额外空间的使用。