[LeetCode 260] Single Number III 详解

题目给出:

Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.

For example:
Given nums = [1, 2, 1, 3, 2, 5], return [3, 5].
 并且要求线性时间内解决。

分析与解法:

我们知道跟他很相似但是比其简单的一道题,就是有一组数,其中有一个数出现过一次,其余的数均出现2次,求出现一次的那个数,方法为从开始异或 到尾。根据异或的特性,两个相同的数异或后为0.最后得到出现一次的那个数字。
  nums = [1, 2, 1, 3, 2, 5]为例, 我们从头异或操作到尾会得到
                                                       1^2^3^1^3^2^5=3^5

可以得到 3^5,不能得到3和5.
我们可以求得3^5的最低为1的那位。因为异或操作不同为1,相同为0,也就是说在最低为1的那一位3和5在那位是不同的:例如3=011; 5=101 那么3^5为110,那么最低为1那位 是第2为。按照这个不同,我们将整个数据分为2组一组在第二位为1的,第二组在第二位为0,分别在各组内异或。就会求得两个数。
代码如下:
#include<iostream>
#include<vector>
using namespace std;


class Solution {
public:
int first(int number)
{
int i=0;
for(i;i<32;i++)
{
int t=1<<i;
if((t&number)==t)
{
return i;
}
}
}
    vector<int> singleNumber(vector<int>& nums) {
    int result_temp=nums[0];
        for(int i=1;i<nums.size();i++)
        {
        result_temp=result_temp^nums[i];
        }
        int save=result_temp;
        int index=first(result_temp);
        index=1<<index;
        for(int i=0;i<nums.size();i++)
        {
        if((nums[i]&index)==index)
        {
        result_temp=result_temp^nums[i];
        }
        }
    save=save^result_temp;
    vector<int> v;
    v.push_back(result_temp);
    v.push_back(save);
    return v;
    }
    
    
};
int main()
{
int a[22]={-1638685546,-2084083624,-307525016,-930251592,-1638685546,1354460680,623522045,-1370026032,-307525016,-2084083624,-930251592,472570145,-1370026032,1063150409,160988123,1122167217,1145305475,472570145,623522045,1122167217,1354460680,1145305475};
vector<int> u;
for(int i=0;i<22;i++)
{
u.push_back(a[i]);


}
Solution s1;
vector<int> r=s1.singleNumber(u);
cout<<r[0]<<" "<<r[1]<<endl;
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值