乐闻世界logo
搜索文章和话题

How to find the only number in an array that doesn't occur twice

4 个月前提问
3 个月前修改
浏览次数32

2个答案

1
2

采用几种不同的方法来解决这个问题。这里我会介绍两种比较常见的方法,一种是使用哈希表,另一种是使用异或操作。

方法一:使用哈希表

使用哈希表来记录数组中每个元素出现的次数,然后遍历哈希表找到只出现一次的数字。

步骤如下:

  1. 初始化一个空的哈希表。
  2. 遍历数组,对于每个元素,如果它不在哈希表中,就添加进去并设置计数为1;如果已经在哈希表中,就将其计数加1。
  3. 再次遍历哈希表,寻找计数为1的元素。

代码示例(Python):

python
def singleNumber(nums): count_map = {} for num in nums: if num in count_map: count_map[num] += 1 else: count_map[num] = 1 for num, count in count_map.items(): if count == 1: return num

方法二:使用异或操作

异或(XOR)操作有一个非常有趣的性质:任何数和0做异或运算结果都是数本身,任何数和自己做异或运算结果都是0。利用这个性质,我们可以轻松找到只出现一次的数字。

步骤如下:

  1. 初始化一个变量 result为0。
  2. 遍历数组,将每个元素与 result进行异或操作。
  3. 由于数组中除了一个数字之外,其他的数字都出现了两次,它们将被抵消。
  4. 最终 result的值就是只出现一次的数字。

代码示例(Python):

python
def singleNumber(nums): result = 0 for num in nums: result ^= num return result

总结

如果考虑到时间和空间效率,使用异或操作的方法更为高效,因为它的时间复杂度是O(n),且空间复杂度为O(1)。而使用哈希表的方法虽然时间复杂度也是O(n),但空间复杂度是O(n),因为需要额外的空间来存储元素及其计数信息。

2024年6月29日 12:07 回复

这两种情况的解决方案有所不同,但我可以为两种情况提供思路。

情况1:寻找只出现一次的数字,其余数字均出现两次或多次

如果数组中所有元素都是成对出现的,除了一个数字只出现一次,那么这个问题的一个非常高效的解决方法是使用异或运算(XOR)。异或运算有以下几个特点:

  • 一个数和它本身做异或运算结果为0,即 a ^ a = 0
  • 一个数和0做异或运算结果为它本身,即 a ^ 0 = a
  • 异或运算满足交换律和结合律,即 a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b

因此,我们可以通过对数组中所有元素进行异或运算,成对出现的数字会两两抵消为0,最终剩下的结果就是唯一一个只出现一次的数字。这个方法的时间复杂度是O(n),空间复杂度是O(1),非常高效。

例如,数组 [4, 1, 2, 1, 2] 中,使用异或运算:

shell
4 ^ 1 ^ 2 ^ 1 ^ 2 = (1 ^ 1) ^ (2 ^ 2) ^ 4 = 0 ^ 0 ^ 4 = 4

最终结果就是 4,这是唯一只出现一次的数字。

情况2:寻找只出现一次的数字,无其他限制

如果数组中数字出现的次数没有限制,那么使用异或运算的方法可能不适用。在这种情况下,我们可以考虑使用哈希表(Hash Table)来记录每个数字出现的次数。

具体步骤如下:

  1. 遍历数组,将每个元素作为键存入哈希表,值是该元素出现的次数。
  2. 再次遍历哈希表,找到值为1的键,即为只出现一次的数字。

这种方法的时间复杂度和空间复杂度都是O(n)。例如,数组 [4, 1, 2, 1, 2, 4, 3],构建哈希表:

plaintext
{ 1: 2, 2: 2, 3: 1, 4: 2 }

遍历哈希表后,我们发现数字 3 的出现次数为1,因此 3 就是唯一只出现一次的数字。

2024年6月29日 12:07 回复

你的答案