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

40 阅读2分钟

解题思路

为了找到班级中唯一一个没有配对的数字,我们可以利用异或(XOR)运算的特性。异或运算有以下几个重要的性质:

  1. 交换律a ^ b = b ^ a
  2. 结合律a ^ (b ^ c) = (a ^ b) ^ c
  3. 自反性a ^ a = 0
  4. 零元素a ^ 0 = a

基于这些性质,我们可以设计一个算法,通过遍历整个数组,将所有数字进行异或运算。由于相同的数字异或结果为0,而0与任何数字异或结果为该数字本身,因此最终的结果就是那个唯一没有配对的数字。

具体代码


# 初始化一个变量来存储异或运算的结果

unique_number = 0

# 遍历数组中的每一个数字

for card in cards:

# 对当前数字进行异或运算

unique_number ^= card

# 返回最终的异或结果,即为唯一没有配对的数字

return unique_number

  


# 测试样例

cards = [1, 1, 2, 2, 3, 3, 4, 5, 5]

print(find_unique_number(cards)) # 输出: 4

### 详细注释

 **函数定义** :


    def find_unique_number(cards):

    定义一个名为 `find_unique_number` 的函数,参数 `cards` 是一个包含整数的列表。

**初始化变量** :


    unique_number = 0

    初始化一个变量 `unique_number` 为 0,用于存储异或运算的结果。

**遍历数组** :

  1111111
    for card in cards:

    使用 `for` 循环遍历数组 `cards` 中的每一个元素。

**异或运算** :

    unique_number ^= card

    对当前遍历到的数字 `card` 进行异或运算,并将结果存储在 `unique_number` 中。由于异或运算的性质,相同的数字异或结果为 0,而 0 与任何数字异或结果为该数字本身。因此,最终 `unique_number` 中存储的就是那个唯一没有配对的数字。

**返回结果** :

  
    return unique_number

    返回 `unique_number`,即唯一没有配对的数字。

 **测试样例** :

 
    cards = [1, 1, 2, 2, 3, 3, 4, 5, 5]

    print(find_unique_number(cards)) # 输出: 4

    定义一个测试样例 `cards`,并调用 `find_unique_number` 函数,打印出结果。

算法分析

  • 时间复杂度 :O(n),其中 n 是数组的长度。我们只需要遍历一次数组,对每个元素进行一次异或运算。
  • 空间复杂度 :O(1),我们只使用了常数级别的额外空间来存储一个变量 unique_number

这个算法充分利用了异或运算的特性,不仅时间复杂度低,而且空间复杂度也非常低,体现了算法的高效性和优化能力。