返回

算法题每日一练:只出现一次的数字

前端

只出现一次的数字

在编程和算法中,经常会遇到这样的问题:给定一个整数数组,其中每个元素都出现了两次,除了一个元素只出现了一次。我们的任务是找出这个只出现了一次的数字。

解决这个问题有几种方法。在这篇文章中,我们将讨论两种最常见的技术:哈希表和位操作。

哈希表

哈希表是一种数据结构,它允许我们根据键值快速查找和插入元素。在本问题中,我们可以使用哈希表来跟踪每个元素出现的次数。具体来说,我们可以使用一个字典,其中键是数组中的元素,值是元素出现的次数。

def single_number_hash(nums):
  """
  使用哈希表找到只出现一次的数字。

  参数:
    nums:一个非空整数数组。

  返回:
    只出现一次的数字。
  """

  num_counts = {}  # 存储每个元素出现的次数。

  for num in nums:
    if num not in num_counts:
      num_counts[num] = 0
    num_counts[num] += 1

  for num, count in num_counts.items():
    if count == 1:
      return num

  return None  # 如果没有只出现一次的数字,则返回 None。

时间复杂度: O(n),其中 n 是数组中的元素个数。

空间复杂度: O(n),因为我们使用了一个哈希表来存储元素的出现次数。

位操作

位操作是另一种可以用来解决这个问题的技巧。位操作允许我们直接对数字的二进制表示进行操作。在这个问题中,我们可以使用异或 (^) 运算符来找到只出现一次的数字。

异或运算符的特点是,当两个位相同(0 XOR 0 或 1 XOR 1)时,结果为 0;当两个位不同(0 XOR 1 或 1 XOR 0)时,结果为 1。

def single_number_bit(nums):
  """
  使用位操作找到只出现一次的数字。

  参数:
    nums:一个非空整数数组。

  返回:
    只出现一次的数字。
  """

  result = 0

  for num in nums:
    result ^= num

  return result

时间复杂度: O(n),其中 n 是数组中的元素个数。

空间复杂度: O(1),因为我们没有使用任何额外的空间。

总结

在这篇文章中,我们讨论了两种解决只出现一次的数字问题的技术:哈希表和位操作。哈希表方法需要额外的空间,但对于大型数据集来说效率较高。位操作方法不需要额外的空间,但对于较小的数据集来说效率更高。

选择哪种方法取决于具体问题和性能要求。