一个整型数组里除了两个数字之外,其他的数字都出现了两次。

数组中只出现一次的数字

http://www.nowcoder.com/questionTerminal/e02fdb54d7524710a7d664d082bb7811

  1. 记数组中存在的唯一的两个数字分别为a,b
  2. 首先以二进制的角度去看所有的数字,每一位均为0,1组成
  3. 对所有数字进行个位上的异或,成对相同的数字结果为0,每一位上都这样异或依次,所以最终每一位上存在1的则必然是因为a,b在这一位上不同
  4. 根据最终结果上存在‘1’的这一位,将原数组分为两组,一组‘1’,一组‘0‘,
  5. 两组数字再分别异或,最终两个结果就是a,b;
class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
        int num=0;

        for(int i=0;i < data.size();i++){
            num^=data[i];//所有数异或,结果为不同的两个数字的异或
        }

        int count=0;//标志位,记录num中的第一个1出现的位置
        for(;count < data.size();count++){
            if((num&(1<<count))!=0){
                break;
            }
        }

        int num_1 = 0;
        int num_2 = 0;

        for(int i=0; i < data.size(); i++){

            if((data[i]&(1<<count))==0){//标志位为0的为一组,异或后必得到一个数字(这里注意==的优先级高于&,需在前面加())
                num_1^=data[i];
            }else{
                num_2^=data[i];//标志位为1的为一组
            }
        }
        *num1 = num_1;
        *num2 = num_2;
    }
};
全部评论
非常巧妙
点赞 回复 分享
发布于 2020-02-05 14:38

相关推荐

Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
offer多多的六边形战士很无语:看了你的博客,感觉挺不错的,可以把你的访问量和粉丝数在简历里提一下,闪光点(仅个人意见)
点赞 评论 收藏
分享
6 收藏 评论
分享
牛客网
牛客企业服务