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.

Example:

Input:  [1,2,1,3,2,5]

Output: [3,5]

Note:

  1. The order of the result is not important. So in the above example, [5, 3] is also correct.
  2. Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?

在一个数组中只有两个数出现了一次,其他数都出现两次,求出这两个数,时间复杂度必须为O(1),而且只能利用常数空间。

设这两个数为a,b,那么首先把数组中所有数字进行异或,从而得到a异或b,再从中找出一位为1,也就是说在这一位上,a和b一个为0,一个为1。得到了这一位之后,我们把在这一位为1的所有数再取异或,由于排除了其中一个数,可以得到一个只出现一次的数,进而得到另外一个数。

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int x=0;
        for(int i=0;i<nums.size();i++) x^=nums[i];
        int y=0;
        for(int i=0;i<32;i++)
        {
            y=1<<i;
            if((y&x)>0) break;
        }

        int a=0;
        for(int i=0;i<nums.size();i++) if((y&nums[i])!=0) a^=nums[i];
        int b=x^a;
        vector<int> result;
        result.push_back(a);
        result.push_back(b);
        return result;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值