您的位置:首页 > 其它

260.leetcode Single Number III(medium)[两个单数]

2016-08-06 11:39 423 查看
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]
.

Note:

The order of the result is not important. So in the above example, 
[5, 3]
 is
also correct.

Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?
数组中只有两个元素只出现了一次,其他元素都出现了两次,因此还是先做异或得到这两个元素异或的结果result,然后获取result最右边为1的位置。因为result为1的位置表示这两个单数在这一位上不同,因此可以按照在这一位上取值不同对数组再重新遍历异或得到r1和r2.
class Solution {
public:
void FindFirstOne(int result,vector<int>& nums,int &r1,int& r2)
{
int pos = 0;
while((result&1) == 0)//寻找最右边是1的位置
{
pos++;
result = result>>1;
}
for(int i=0;i<nums.size();i++)
{
if((nums[i]>>pos)&1)
{
r1^=nums[i];
}else
r2^=nums[i];
}
}
vector<int> singleNumber(vector<int>& nums) {
if(nums.size()<=2) return nums;
int result = 0;
for(int i=0;i<nums.size();i++)
result ^=nums[i];
int r1=0,r2=0;
FindFirstOne(result,nums,r1,r2);
vector<int> last;
last.push_back(r1);
last.push_back(r2);
return last;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: