• 剑指offer 数组中只出现一次的数字


    题目:

    一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

    代码:

     1 class Solution {
     2 public:
     3     void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
     4         int length = data.size();
     5         int resultExclusiveOR = 0;
     6         
     7         for(int i = 0; i < length; i ++)
     8             resultExclusiveOR ^= data[i];
     9         
    10         unsigned int indexOf1 = FindFirstBitIs1(resultExclusiveOR);
    11         
    12         *num1 = 0; *num2 = 0;
    13         for(int j = 0; j < data.size(); j++){
    14             if(IsBit1(data[j], indexOf1))
    15                 *num1 ^= data[j];
    16             else
    17                 *num2 ^= data[j];
    18         }
    19     }
    20     
    21     unsigned int FindFirstBitIs1(int num){
    22         int indexBit = 0;
    23         while(((num & 1) == 0) && indexBit < 8*sizeof(int)){
    24             num = num >> 1;
    25             indexBit ++;
    26         }
    27         return indexBit;
    28     }
    29     
    30     bool IsBit1(int num, unsigned int indexBit){
    31         num = num >> indexBit;
    32         return (num&1);
    33     }
    34 };

    我的笔记:

      首先:位运算中异或的性质:两个相同数字异或=0一个数和0异或还是它本身
     
      当只有一个数出现一次时,我们把数组中所有的数,依次异或运算,最后剩下的就是落单的数,因为成对儿出现的都抵消了。
     
      依照这个思路,我们来看两个数(我们假设是AB)出现一次的数组。我们首先还是先异或,剩下的数字肯定是A、B异或的结果,这个结果的二进制中的1,表现的是A和B的不同的位。我们就取第一个1所在的位数,假设是第3位,接着把原数组分成两组,分组标准是第3位是否为1。如此,相同的数肯定在一个组,因为相同数字所有位都相同,而不同的数,肯定不在一组。然后把这两个组按照最开始的思路,依次异或,剩余的两个结果就是这两个只出现一次的数字。
  • 相关阅读:
    Docker是什么
    常用架构模式优缺点
    DDD领域模型自动生成?
    组合数【模板】
    组合数【模板】
    HDU 4800 Josephina and RPG【概率dp】
    HDU 4800 Josephina and RPG【概率dp】
    HDU 4424 Conquer a New Region【并查集】【思维题】
    HDU 4424 Conquer a New Region【并查集】【思维题】
    HDU 4427 Math Magic【dp+优化+滚动数组】【好题】
  • 原文地址:https://www.cnblogs.com/john1015/p/13087958.html
Copyright © 2020-2023  润新知