美文网首页
【算法题】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