Single Number III

来源:互联网 发布:mac 导入照片 位置 编辑:程序博客网 时间:2024/06/04 01:03

题目描述:

给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字。

样例 给出 [1,2,2,3,4,4,5,3],返回 1和5

挑战 O(n)时间复杂度,O(1)的额外空间复杂度

题目分析:

1:这道题利用了异或位运算的一个性质,即:一个数与自身异或的结果为0。我们只需遍历数组中的每一个元素,并将其进行异或。因为,异或满足交换律,所以最终的异或结果将仅仅包含只出现一次的那个数。

如:1 ^ 2 ^ 2 ^ 1 ^3 ^ 4 ^ 3 = 1 ^ 1 ^ 2 ^ 2 ^ 3 ^ 3 ^ 4 = 4


2:如果对所有元素进行异或操作,最后剩余的结果是出现次数为1次的两个数的异或结果,此时无法直接得到这两个数具体的值。但是,因为这两个数一定是不同的,所以最终异或的值至少有一个位为1。我们可以找出异或结果中第一个值为1的位,然后根据该位的值是否为1,将数组中的每一个数,分成两个部分。这样每个部分,就可以采用Sing number I中的方法得到只出现一次的数。

3:假设我们要找的这两个数为 a, b, x = a ^ b

首先,a 肯定不等于 b,那么说明它们的二进制位一定是不完全相同的,所以 x 肯定不为 0

也就是说,a b 一定存在某一位,使得在它们中的某个数中是 0,而在另一个数中是 1,这是他们之间的一个差别。

我们可不可以利用这个差别来把这两个数从 x 中揪出来呢?

是可以的。

利用这个差别,我们可以将整个 nums 集合分成两个集合。一个集合中是这某一位”  0 的在nums中的所有数,假设为集合 A。而另一个集合是这某一位”  1 的在nums中的所有数。假设 a 的这某一位  0 b 这个某一位1,那么显然 a 在集合 A 中,b 在集合 B 中,这样问题就完全转化成了与 I 一样的两个子问题,于是可以得解。

#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:

int getFirstBit1(int num){
int index = 0;
while((num & 1) == 0){
num = num >> 1;
index ++;
}
return index;
}
bool isBit1(int num,int index){
num = num>>index;
return (num & 1)==1;
}
vector<int> singleNumber(vector<int>& nums) {
if(nums.size()<3)
return nums;

vector<int> result;
vector<int> nums1;
vector<int> nums2;

int sum = 0;
for(int i = 0 ;i<nums.size();i++){
sum ^= nums[i];
}
int index = getFirstBit1(sum);
for(int i = 0 ;i<nums.size();i++){
if(isBit1(nums[i],index)){
nums1.push_back(nums[i]);
}else {
nums2.push_back(nums[i]);
}
}
sum = 0;
for(int j =0;j<nums1.size();j++){
sum ^= nums1[j];
}
result.push_back(sum);
sum = 0 ;
for(int j =0;j<nums2.size();j++){
sum ^= nums2[j];
}
result.push_back(sum) ;
return result;
}
};
int main() {

return 0;
}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 富贵竹的黄叶子怎么办 土培富贵竹发黄怎么办 富贵竹根变黄了怎么办 富贵竹叶子尖发黄怎么办 富贵竹新叶子发黄怎么办 富贵竹杆变黄了怎么办 水培观音竹叶子发黄怎么办 富贵竹叶子根部发黄怎么办 观音竹叶子干了怎么办 富贵竹叶子发干怎么办 观音竹老叶发黄怎么办 发财树缺营养怎么办 富贵竹根部长芽怎么办 门口的竹子发黄怎么办 富贵竹长根了怎么办 水养竹子太长怎么办 海棠根腐烂了怎么办 水竹根腐烂了怎么办 水培富贵竹黑根怎么办 转运竹根部发黑怎么办 富贵竹跟泡烂怎么办 富贵竹根烂了怎么办 富贵竹的须变黑怎么办 泡富贵竹水发臭怎么办 富贵竹水变黑了怎么办 水观音叶子黄了怎么办 富贵竹根部腐烂发臭怎么办 富贵竹根部发粘怎么办 水竹草叶子发黄怎么办 水竹叶子心发黄怎么办 塔竹叶子发黄怎么办 铁树叶有发黄怎么办 铁树夏天叶发黄怎么办 铁树的叶尖发黄怎么办 铁树叶子发黄是怎么办 榕树盆景长蜜怎么办 六月雪叶子枯萎了怎么办 小叶冬青掉叶子怎么办 榕树叶子发黄落叶怎么办 榕树的叶子发黄怎么办 盆景的叶子发黄怎么办