260. 只出现一次的数字 III 力扣(中等) 升级位运算

260. 只出现一次的数字 III

给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。

进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?

示例 1:

输入:nums = [1,2,1,3,2,5]
输出:[3,5]
解释:[5, 3] 也是有效的答案。

 

题解:https://leetcode-cn.com/problems/single-number-iii/solution/acmjin-pai-ti-jie-ha-xi-biao-wei-yun-sua-7dj7/

出现偶数次的数字,经过 异或 会变0,本题,所有数字进行异或后的 XorNum=x1 xor x2,x1和x2均只出现了一次。

XorNum!=0,其中为1的位置,表示两个数字中这位数字不同,根据这个位置是否为1,将多有的数字分成两组,会将x1和x2分到不同的组中

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
     int sum=0;
     for(auto num:nums)
        sum=sum^num;
     int pos=-1;
     for(int i=0;i<=31;i++)
       if(sum & (1<<i)) {pos=i; break;}
     vector<int> res(2,0);
    for(auto num:nums)
    {
        if(num & (1<<pos)) res[0]=res[0]^num;
          else res[1]=res[1]^num;
    } 
    return res;
    }
};

 

上一篇:全球时区概念


下一篇:2018美亚F-Mobile