第1节 基础-数组中只出现一次的数字 (牛客网)

题目来源:牛客网

题目描述

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

题目解析:

使用异或,两个相同的数字异或会等于0; 
若只存在一个数,一直异或就会把这个数生下来; 
若两个数,一直异或,这两个不同的数异或之后会生成一个数,某位上一定会出现1,则表示这个位上,两数不同;根据这个位,将数组分成两组,每组即只存在一个不同的数。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int Getbit(int num)//这个函数的作用是为了进行分组
{
  int index=0;
  //获取第一位的二进制值
  while((num&1)==0)//结束循环的条件判断
  {
    index++;
    num=num>>1;//右移2位,是为了11000=>01100
  }
  return index;//获取一个数的二进制表达形式
  //第index位是1  
}
bool isbit(int num,int index)
//判断一个数的二进制位第n位是1还是0
{
  num=num>>index;
  return num&1;
}
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) 
{
  if(data.size()<2)
     return ;//只有两个元素
  int index=data[0];
  for(int i=0;i<(int)data.size();i++)
  {
      index^=data[i];//异或操作是为了取出只出现一次的数字
  }
  if(index==0)
     return;
  int nbit=Getbit(index);
  for(int i=0;i<(int)data.size();i++)
  {
    if(isbit(data[i],nbit))
    {
      *num1^=data[i];
    }
    else
    {
      *num2^=data[i];
    }
  } 
}
int main()
{
  return 0;
}

没写主函数部分。代码和有些大佬一样只是多了个解释。我花了好久才看明白。
 

点赞