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

100 阅读2分钟

初级思路

针对该题,脑子里面第一个想法是使用穷举法,针对每个数字,查找该数字的个数,如果有一个数字的个数为偶数则返回该数字的值。但是其时间复杂度为O(n^2),效率极其低下。

豆包MarsCode AI

使用豆包MarsCode AI的"思路提示"功能,给出的方案是最优的。方案如下。

我们可以利用异或运算的性质高效解决这个问题。异或运算具有以下特性:1)一个数字与自身异或结果为0。2)一个数字与0异或结果为自身。3)异或运算满足交换律和结合律。根据题目描述,除了一个数字外,其余数字都出现了两次,这些成对的数字在异或运算中会互相抵消为0,最终的结果就是那个唯一出现一次的数字。因此,我们可以将所有数字依次进行异或操作,最终的结果就是所求的独特数字。该算法的时间复杂度为O(n),只需一个变量存储结果,空间复杂度为 ,高效且简洁。

代码如下

def solution(inp):
    # Edit your code here
    res = 0
    for i in inp:
        res ^= i
    return res

这个思路使用了最基础的运算性质,由于每个数字在计算机中都是以二进制的形式存储计算的。因此根据该性质,在O(n)的时间复杂度下即可完成题目要求。

代码详解

  1. 初始化变量

unique 被初始化为 0,这是因为在异或操作中,0是一个特殊的中性元素,任何数与0异或都保持其本身不变(即 a ^ 0 = a)。这一特性确保了后续的异或操作可以顺利进行。

  1. 遍历数组

使用 for 循环依次访问数组中的每个数字 num。对于每个数字,将其与当前的 res 值进行异或更新。

  1. 异或运算核心逻辑

异或运算的关键特性有两点:

• 数字与自身异或结果为0。

• 数字与0异或结果为自身.

因此,当数组中所有的数字都被依次异或时,成对的数字会被抵消为0,而唯一未成对的数字会被保留在 res 中。

  1. 返回结果

遍历完成后,res 中的值即为数组中唯一未成对的数字,直接返回即可。

优势分析:

该算法遍历数组一次,时间复杂度为 O(n)。此外,它仅使用了一个辅助变量 res,因此空间复杂度为 O(1)。这种方法利用了异或运算的数学特性,避免了额外的数据结构(如字典或集合)的使用,是一个高效而优雅的解决方案。