zoukankan      html  css  js  c++  java
  • 剑指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。如此,相同的数肯定在一个组,因为相同数字所有位都相同,而不同的数,肯定不在一组。然后把这两个组按照最开始的思路,依次异或,剩余的两个结果就是这两个只出现一次的数字。
  • 相关阅读:
    虚拟用户图分析
    概要图分析
    服务器资源监控视图
    场景监控之基本信息
    controller场景设计
    ip欺骗
    面试准备
    性能测试
    (一)总结
    bug的描述
  • 原文地址:https://www.cnblogs.com/john1015/p/13087958.html
Copyright © 2011-2022 走看看