找单独的数代码解析|豆包MarsCode AI刷题

101 阅读2分钟

解题思路: 为了在一个班级中找到那个持有独特数字卡片的同学手上的数字,我们可以利用异或运算的特性。异或运算有以下几个重要的性质: 对于任何数 x,x ^ x = 0,即一个数与自身异或的结果为0。 对于任何数 x,x ^ 0 = x,即一个数与0异或的结果为其本身。 异或运算满足交换律和结合律。 由于除了一个数字之外,所有数字都恰好出现了两次,我们可以将所有数字进行异或运算。成对出现的数字会互相抵消(异或结果为0),最终剩下的就是那个只出现一次的数字。 图解 假设我们有以下数组 [1, 1, 2, 2, 3, 3, 4, 5, 5]: 初始化 result = 0。 遍历数组: result = 0 ^ 1 = 1 result = 1 ^ 1 = 0 result = 0 ^ 2 = 2 result = 2 ^ 2 = 0 result = 0 ^ 3 = 3 result = 3 ^ 3 = 0 result = 0 ^ 4 = 4 result = 4 ^ 5 = 1 result = 1 ^ 5 = 0 最终 result 的值为 4,即那个持有独特数字卡片的同学手上的数字。 代码详解 def solution(inp): result = 0 for num in inp: result ^= num return result if name == "main": # 测试用例 print(solution([1, 1, 2, 2, 3, 3, 4, 5, 5]) == 4) # 输出:True print(solution([0, 1, 0, 1, 2]) == 2) # 输出:True print(solution([10, 20, 10, 30, 30]) == 20) # 输出:True print(solution([7, 8, 9, 7, 8]) == 9) # 输出:True #### 实现原理

该算法利用了异或运算的性质:即 a ^ 0 = a。 任何数和0做异或运算,结果仍然是原来的数,

  • 任何数和0做异或运算,结果仍然是原来的数,即 a ^ 0 = a
  • 任何数和其自身做异或运算,结果是0,即 a ^ a = 0
  • 异或运算满足交换律和结合律。 解释 result 初始化为 0,因为异或运算的中立元素是 0。 遍历输入数组 inp,对每个数字 num 进行异或运算,并将结果存储在 result 中。 最终 result 的值即为那个只出现一次的数字。 时间复杂度和空间复杂度 时间复杂度:O(n),其中 n 是班级的人数。因为我们只需要遍历数组一次,对每个元素执行一次异或操作。 空间复杂度:O(1),因为我们只使用了一个额外的变量来存储最终结果,没有使用任何额外的数据结构。 这种方法不仅满足了题目中的时间复杂度和空间复杂度要求,而且具有高度的简洁性和优雅性。