美文网首页
【算法题】28.只出现一次的数字

【算法题】28.只出现一次的数字

作者: _涼城 | 来源:发表于2022-05-25 09:23 被阅读0次

题目

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

可以不使用额外空间来实现吗?

示例1

输入: [2,2,1]
输出: 1

示例2

输入: [4,1,2,1,2]
输出: 4

思路

    普通情况下在数组中找到元素出现次数,可以通过哈希表存储每个元素和该元素出现的次数。遍历数组即可得到每个元素出现的次数,并更新哈希表,最后遍历哈希表,得到只出现一次的元素。

    数组中 n - 1个元素均出现两次,也可以使用集合存储出现过的元素,第一次出现加入集合,第二次出现从集合中删除该元素,最终得到集合中唯一的元素。

    这两种解法都需要使用 O(n)的空间,那么如何可以不使用额外空间呢?我们可以使用异或运算,异或运算的运算法则如下:

  1. 归零律a\oplus a = 0

  2. 恒等律a\oplus 0 = a

  3. 交换律a\oplus b = b\oplus a

  4. 结合律a\oplus b \oplus c = a\oplus (b \oplus c)

  5. 自反a\oplus b \oplus a = b

    数组中 (n -1)/ 2 个元素重复,假设 m =(n -1)/ 2 ,则数组中有 m 个数各出现两次,一个数出现一次。令 a_{1}、a _2、...、a_m 为出现两次的 m 个数,a_{m+1} 为出现一次的数。数组中的全部元素的异或运算结果总是可以写成如下形式:
(a_1 \oplus a_1) \oplus... (a_m \oplus a_m) \oplus a_{m+1} = a_{m+1};
    因此,将所有数字按照顺序异或运算,最后剩下的结果即为唯一的数字 a_{m+1}

代码实现

int singleNumber(int* nums, int numsSize){
      int ret = 0;
      for(int i = 0; i < numsSize;i++){
           ret ^= nums[i]; 
      }
      return ret;
}

相关文章

网友评论

      本文标题:【算法题】28.只出现一次的数字

      本文链接:https://www.haomeiwen.com/subject/ctleprtx.html