【面试题】剑指Offer-40-数组中只出现一次的数字

来源:互联网 发布:北京行知园地址 编辑:程序博客网 时间:2024/05/21 06:56

题目概述


解题思路

我们知道,一个数和自己异或的结果是0

如果这个整形数组中只有一个数字出现一次的话,全部异或后的结果就是出现一次的数字

由于这道题目是两个数字a,b出现了一次,我们也可以将所有的数进行异或

得到的结果就是a,b异或的结果ret

此时,我们可以根据ret的二进制中任何一位数字为1将整形数组分成两组

a,b就分别处于这两组之中

然后分别对两组进行所有数字异或

这样便可以求出结果

代码实现

#include<iostream>using namespace std;#include<vector>//找数组中有两个数只出现了一次void FunNumApperanceOnce(vector<int>& v, int& num1, int& num2){if (v.size() <= 2)return;int ret = 0;//找出所有数字亦或之后的结果vector<int>::iterator it = v.begin();while (it != v.end()){int num = *it;ret = ret^num;++it;}//判断最右边的1是第几位size_t i = 0;for (; i < 32; ++i){if ((ret << i) & 1 == 1)break;}//根据位数分成两组,分别求出两个出现一次的数字it = v.begin();while (it != v.end()){int num = *it;if (num&(1 << i) == 1){num1 ^= num;}else{num2 ^= num;}++it;}}

1 0