给定一个整数数组 nums,其中恰好有两个元素只出现一次,其他所有元素均出现两次。 找出只出现一次的那两个元素。
示例:
给定 nums = [1, 2, 1, 3, 2, 5], 返回 [3, 5].
注意:
结果的顺序并不重要,对于上面的例子 [5, 3] 也是正确答案。
你的算法应该具有线性复杂度,你能否仅使用恒定的空间复杂度来实现它?
详见:https://leetcode.com/problems/single-number-iii/description/
Java实现:
class Solution { public int[] singleNumber(int[] nums) { int size=nums.length; int[] res=new int[2]; if(size==0||nums==null){ return res; } int sum=0; for(int num:nums){ sum^=num; } int n=1; while((sum&n)==0){ n=n<<1; } for(int num:nums){ if((num&n)!=0){ res[0]^=num; }else{ res[1]^=num; } } return res; } }
C++实现:
方法一:
class Solution { public: vector<int> singleNumber(vector<int>& nums) { int size=nums.size(); if(size==0||nums.empty()) { return vector<int>(); } int sum=0; for(int val:nums) { sum^=val; } int n=1; //从低位向高位,第一个非0位所对应的数字 while((sum&n)==0) { n=n<<1; } vector<int> res(2,0); for(int val:nums) { if(n&val) { res[0]^=val; } else { res[1]^=val; } } return res; } };
方法二:
class Solution { public: vector<int> singleNumber(vector<int>& nums) { int size=nums.size(); if(size==0||nums.empty()) return vector<int>(); int diff=0; for(auto &ele:nums) diff^=ele; vector<int> res(2,0); diff&=-diff; for(auto &ele:nums) if(diff&ele) res[0]^=ele; else res[1]^=ele; return res; } };