今天先从一道简单的题入手,体验一下豆包的ai刷题跟别的刷题有什么不一样吧
题目:找单独的数
问题描述
在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小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
- 班级人数为奇数
- 除了一个数字卡片只出现一次外,其余每个数字卡片都恰好出现两次
首先进行题目分析:
在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小 C 快速找到那个拿了独特数字卡片的同学手上的数字是什么。
并且题目有以下要求:
- 设计一个算法,使其时间复杂度为 O (n),其中 n 是班级的人数。
- 尽量减少额外空间的使用,以体现你的算法优化能力。
解题思路
异或操作(XOR)
- 利用异或操作的特性:相同的数字异或结果为 0,任何数字与 0 异或结果为该数字本身。
- 遍历所有同学的卡片数字,将它们依次进行异或操作。因为除了一个数字外,其他数字都出现两次,所以相同的数字在异或操作后会相互抵消,最终剩下的就是那个独特的数字。
这里如果自己没思路的话,可以使用ai来获得解题思路
根据思路来解题
def solution(num_list):
# Edit your code here
unique_num = 0
for num in num_list:
unique_num ^= num
return unique_num
if __name__ == "__main__":
# Add your test cases here
print(solution([1, 1, 2, 2, 3, 3, 4, 5, 5]) == 4)
print(solution([0, 1, 0, 1, 2]) == 2)
遇到不会的或者不懂的还可以通过ai一建解释
总结
这道题主要考查以下知识点:
一、算法设计
-
时间复杂度分析
- 要求设计一个时间复杂度为 O (n) 的算法,其中 n 是班级的人数。这涉及到对算法运行时间随输入规模增长的理解,以及如何通过合理的算法设计来达到特定的时间复杂度要求。
-
空间复杂度分析
- 需要尽量减少额外空间的使用,体现算法优化能力。这考查了对算法运行时所需额外存储空间的评估和优化方法。
二、位运算
-
异或操作(XOR)的特性
-
相同的数字进行异或操作结果为 0(例如,a ^ a = 0)。
-
任何数字与 0 进行异或操作结果为该数字本身(例如,a ^ 0 = a)。
-
异或操作满足交换律和结合律,即 a ^ b ^ a = b ^ a ^ a = b ^ (a ^ a) = b。
-
利用这些特性,可以高效地找出数组中只出现一次的数字,而不需要使用额外的数据结构来存储已经出现过的数字。
-
通过这道题,能够检验对算法复杂度分析和位运算操作的掌握程度,以及在实际问题中运用这些知识设计高效算法的能力。