AI刷题实例解析| 豆包MarsCode AI刷题

43 阅读2分钟

问题描述: 在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。除了一个数字之外,所有的数字都恰好出现了两次。要求找到那个唯一出现了一次的数字。

要求

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

2.尽量减少额外空间的使用。

思路

这个问题可以通过位运算来高效地解决。位运算有一个很好的性质:它可以在不使用额外空间的情况下对数字进行操作。可以利用异或运算的性质:

  1. 异或运算的性质

    • 任何数和自身异或结果为0
    • 任何数和0异或结果为它本身
    • 异或运算满足交换律和结合律
  2. 解决方案

    • 可以将所有数字进行异或运算。
    • 由于成对出现的数字在异或运算后会抵消(变成0),最后剩下的就是只出现一次的数字。

假设班级中有5个同学,他们手中的数字分别是:2, 3, 2, 3, 5。

初始化一个变量 result = 0。 依次异或每个数字: result = result \oplus 2 = 0 \oplus 2 = 2 result = result \oplus 3 = 2 \oplus 3 = 1 result = result \oplus 2 = 1 \oplus 2 = 3 result = result \oplus 3 = 3 \oplus 3 = 0 result = result \oplus 5 = 0 \oplus 5 = 5 最后,result 的值就是只出现一次的数字 5

代码实现

def find_unique_number(numbers):
    result = 0
    for number in numbers:
        result ^= number
    return result
numbers = [2, 3, 2, 3, 5]
unique_number = find_unique_number(numbers)
print("The unique number is:", unique_number)

关键点总结

  • 异或运算的性质:任何数和自身异或结果为0,任何数和0异或结果为它本身。这两个性质保证了成对出现的数字在异或运算后会抵消,而只出现一次的数字会保留下来。
  • 时间复杂度:只遍历了一次所有数字,所以时间复杂度是O(n)。
  • 空间复杂度:使用常数级别的额外空间(result变量),所以空间复杂度是O(1)。

在这个题目中,它利用了异或运算的性质,特别是自反性和归零性,来有效地找到只出现一次的元素。这种方法简单易懂,且高效。

在实际应用中,我觉得这种技巧可以用于解决各种类似的问题,比如找出数组中只出现一次的数字(其他数字都出现偶数次)等其他应用。深入理解异或运算的性质和应用,对于提高编程能力和解决问题的能力都是非常有帮助的。

所以我们要注重对知识的积累,才能想到相应的方法去解决,当然也要进行实战训练,对题目的积累等。