学习方法与心得3——找单独的数题 | 豆包MarsCode AI刷题

48 阅读3分钟

问题描述

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

要求:

1.设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。

2.尽量减少额外空间的使用,以体现你的算法优化能力。

代码实现

def solution(inp):
    unique_num = 0
    for num in inp:
        unique_num ^= num
    return unique_num

if __name__ == "__main__":
    print(solution([1, 1, 2, 2, 3, 3, 4, 5, 5]) == 4)
    print(solution([0, 1, 0, 1, 2]) == 2)
    print(solution([7, 3, 3, 7, 10]) == 10)

一、题目解析

本题属于经典的位运算问题,核心是利用异或运算的性质来找出数组中唯一不重复的数字。题目要求算法的时间复杂度为 ,并尽量减少额外的空间使用。具体思路如下:

1、异或运算的性质

  • 自反性:任何数与自己异或结果为 0。
  • 与 0 异或:任何数与 0 异或结果为它本身。
  • 交换律和结合律:异或运算满足交换律和结合律。

基于上述性质,如果一个数组中,除了一个数字外其他数字都出现两次,那么将所有数字进行异或运算,成对的数字会抵消为 0,最后剩下的就是那个唯一的数字。

2、解题步骤

  • 初始化一个变量 unique_num 为 0。
  • 遍历数组中的每个数字,将它与 unique_num 进行异或运算。
  • 遍历结束后,unique_num 就是唯一的数字。

3、示例分析

以输入 cards = [1, 1, 2, 2, 3, 3, 4, 5, 5] 为例:

  • 初始状态:unique_num = 0

  • 异或过程:

    0 ^ 1 = 1
    1 ^ 1 = 0
    0 ^ 2 = 2
    2 ^ 2 = 0
    0 ^ 3 = 3
    3 ^ 3 = 0
    0 ^ 4 = 4
    4 ^ 5 = 1
    1 ^ 5 = 4

最后,unique_num = 4,即为唯一的数字。

二、知识总结

  • 异或运算的高效性:异或运算可以在 时间内解决寻找唯一数字的问题,并且不需要额外的空间存储临时变量,算法简单高效。
  • 数组遍历与操作结合:本题展示了如何在一次遍历中完成计算,体现了对时间复杂度和空间复杂度的优化。
  • 数学性质在编程中的应用:异或运算本质上是数学的逻辑操作,将其与数组特性结合使用,可以解决许多类似问题(例如:判断数组中是否有重复数字)。

三、学习建议

对于入门学习者,可以从了解异或的基础性质入手,然后尝试用它解决一些简单问题,例如翻转比特位或查找单个数字。

四、总结建议

将 AI 工具与个人学习计划结合,逐步提升编程能力,既能提高刷题效率,又能夯实基础知识。