掘金刷题解析:1找单独的数| 豆包MarsCode AI刷题

87 阅读3分钟

学习笔记:寻找唯一未成对数字的详细分析

问题背景

在这个问题中,我们面临的是一个典型的算法问题,即在一个数组中找到一个只出现一次的数字,而其他所有数字都出现了两次。这个问题可以被看作是一个变种的“单例问题”,在这个问题中,我们不是寻找一个特定的单例,而是寻找一个在数值上独特的单例。

算法选择

对于这个问题,我们选择了异或(XOR)操作作为解决方案。异或操作是一种位运算,它在计算机科学中有着广泛的应用,特别是在涉及到位操作的问题中。异或操作的一个关键特性是,任何数与自身异或的结果为0,任何数与0异或的结果是它本身。这个特性使得异或成为了解决这个问题的理想选择。

算法逻辑

  1. 初始化一个变量 ans,用于存储异或的结果。
  2. 遍历输入数组 inp 中的每个数字。
  3. 对于数组中的每个数字,将其与 ans 进行异或运算,并将结果赋值回 ans
  4. 由于成对的数字在异或运算中会相互抵消,最终 ans 中存储的将是那个只出现一次的数字。

代码实现细节

在代码实现中,我们定义了一个函数 solution,它接受一个数组 inp 作为参数,并返回那个只出现一次的数字。函数内部,我们使用了一个简单的循环来遍历数组,并在每次迭代中更新 ans 的值。

时间复杂度分析

算法的时间复杂度为 O(n),其中 n 是数组 inp 的长度。这是因为我们需要遍历数组中的每个元素一次。在遍历过程中,我们对每个元素执行一个常数时间的操作(异或运算)。

空间复杂度分析

算法的空间复杂度为 O(1),因为我们只使用了一个额外的变量 ans 来存储结果。这个变量的大小不依赖于输入数组的大小,因此空间复杂度是常数级别的。

测试样例分析

我们提供了三个测试样例来验证算法的正确性:

  1. 测试样例1中,数组中除了数字4之外,其他数字都出现了两次。因此,输出应该是4。
  2. 测试样例2中,数组中数字2只出现了一次,而其他数字都出现了两次。因此,输出应该是2。
  3. 测试样例3中,数组中数字10是唯一的单例,因此输出应该是10。

约束条件分析

  • 1 ≤ cards.length ≤ 1001:这个条件告诉我们数组的长度有一个上限,这确保了我们的算法在最坏情况下的运行时间是可预测的。
  • 0 ≤ cards[i] ≤ 1000:这个条件限制了数组中元素的数值范围,这对于算法的实现没有直接影响,但是它告诉我们输入数据的规模。
  • 班级人数为奇数:这个条件是问题的关键,它保证了一定有一个数字是单例。
  • 除了一个数字卡片只出现一次外,其余每个数字卡片都恰好出现两次:这个条件是问题的基础,它定义了问题的性质。