“异或”处理数组的相关算法的面试题

例1,寻找数组中丢失的数。。。
有一组数字,从1到n减少了一个数,顺序也被打乱了,放在一个n-1的数组里,请找出丢失的数字。

解题思路:1,对1-n个数做异或运算,得到XOR = 1^2^3^4….^n。
2, 用XOR与当前n-1数组的所有元素依次取异或:
因为XOR中与当前数字相同的数,都在异或运算中抵消掉了,最终剩下的,就是我们要找的那个丢失的数。


void FindNumsAppearOnce(int data[], int length, int &num1, int &num2)
{
      if (length < 2)
            return;


  int resultExclusiveOR = 0;
      for (int i = 0; i < length; ++ i)
            resultExclusiveOR ^= data[i];


  unsigned int indexOf1 = FindFirstBitIs1(resultExclusiveOR);

  num1 = num2 = 0;
      for (int j = 0; j < length; ++ j)
      {

  if(IsBit1(data[j], indexOf1))
                  num1 ^= data[j];
            else
                  num2 ^= data[j];
      }
}


unsigned int FindFirstBitIs1(int num)
{
      int indexBit = 0;
      while (((num & 1) == 0) && (indexBit < 32))
      {
            num = num >> 1;
            ++ indexBit;
      }

   return indexBit;
}


bool IsBit1(int num, unsigned int indexBit)
{
      num = num >> indexBit;

   return (num & 1);
   }

你可能感兴趣的:(面试算法题)