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

34 阅读3分钟

问题描述

在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。 要求:

  1. 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
  2. 尽量减少额外空间的使用,以体现你的算法优化能力。

约束条件

  • 1 ≤ cards.length ≤ 1001
  • 0 ≤ cards[i] ≤ 1000
  • 班级人数为奇数
  • 除了一个数字卡片只出现一次外,其余每个数字卡片都恰好出现两次。

题目解析

在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。这个问题看似简单,但实际上涉及到了算法设计和优化的核心概念。

解题思路

为了满足题目的时间和空间复杂度要求,我利用位运算中的异或运算(XOR)来解决这个问题。异或运算具有以下几个关键性质:

  • 自反性:任何数与自身异或的结果是 0,即 a ^ a = 0
  • 零元素:任何数与 0 异或的结果是它本身,即 a ^ 0 = a
  • 交换律和结合律:异或运算满足交换律和结合律,即 a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b

代码展示

def solution(cards): result = 0 # 遍历列表中的每一个数字,进行异或运算 for card in cards: result ^= card return result

if name == "main": # 测试样例 print(solution([1, 1, 2, 2, 3, 3, 4, 5, 5]) == 4) print(solution([0, 1, 0, 1, 2]) == 2) print(solution([7, 3, 3, 7, 10]) == 10)

算法分析

  • 时间复杂度:由于我们只需要遍历一次列表,因此时间复杂度为 O(n)。
  • 空间复杂度:我们只使用了一个额外的变量 result,因此空间复杂度为 O(1)。 经过最终实验,该代码运行正确。

本题总结

通过使用异或运算,我成功地设计了一个时间复杂度为 O(n) 且空间复杂度为 O(1) 的算法来解决寻找独特数字卡片的问题。这个算法对于目前的我来说,不仅高效,而且非常简洁。

进一步思考

虽然本题已经得到了完美的解决,但在实际应用中,我们可能会遇到更复杂的情况,例如多个数字只出现一次,或者数字的范围更大。在这种情况下,我们需要根据具体问题选择合适的数据结构和算法,进一步优化解决方案。在实际编程中,掌握和灵活运用位运算是提升算法效率和优化代码的重要手段。 总之,通过解决这个问题,我不仅学会了如何使用异或运算来高效地找到唯一出现的数字,还加深了对算法设计和优化的理解。