豆包代码第一题思路和题解

242 阅读2分钟

要解决这个问题,我们可以利用位运算中的异或(XOR)操作。异或操作有一个非常有用的性质:对于任何整数 a,有 a ^ a = 0a ^ 0 = a。这意味着如果一个数字出现了两次,那么这两个相同的数字进行异或操作的结果是0;而一个数字与0进行异或操作,结果还是这个数字本身。

基于这个性质,如果我们对数组中的所有数字进行异或操作,成对出现的数字会相互抵消变为0,最终剩下的就是那个只出现一次的数字。

问题背景

在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。除了一个数字之外,所有的数字都恰好出现了两次。我们需要找到那个只出现一次的数字。

解决方案概述

我们可以利用位运算中的异或(XOR)操作来解决这个问题。异或操作有以下两个关键性质:

  1. 相同数字异或为0:对于任何整数 aa ^ a = 0
  2. 与0异或保持不变:对于任何整数 aa ^ 0 = a

基于这些性质,如果我们对数组中的所有数字进行异或操作,那么成对出现的数字会相互抵消变为0,最终剩下的就是那个唯一出现一次的数字。

详细步骤

  1. 初始化变量:我们定义一个变量 unique 并将其设置为0。这个变量将用来存储最终的结果。
  2. 遍历数组:我们遍历整个数组 cards,对于每个元素 card,我们将它与 unique 进行异或操作,并将结果赋值回 unique
  3. 返回结果:遍历结束后,unique 就是那个只出现一次的数字。

代码

def solution(cards):
    # Edit your code here
    unique_number = 0
    for num in cards:
        unique_number ^=num

    return unique_number

这段代码首先定义了一个函数 find_unique_number,它接受一个列表 cards 作为参数。然后,通过遍历列表中的每一个元素,并将其与 unique 变量进行异或操作,最后返回 unique 的值,即为那个只出现一次的数字。

这种方法非常高效,因为它既满足了时间复杂度的要求,又几乎不使用额外的空间。