只出现一次的数字 III
题目链接
题目描述
:
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
进阶
:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
方法1:哈希
思路
:
- 建立一个数字用来映射次数
- 遍历拿出次数次数为1的
方法2:位操作
思路
:
- 用0把数组里所有的数字亦或一遍得到ret
- 取得ret的二进制位从右到左第一个1的位置pos(表示两个只出现一次的数在这个位不一样,分别亦或最终可以分别取到这两个数)
- 分组:定义两个值为0的数num1,num2, 把原数组里的所有元素按2中的pos上是否为1分为两组,同时两组分别亦或num1,num2
- 返回{num1, num2}
代码如下:
class Solution { public: vector<int> singleNumber(vector<int>& nums) { if(nums.size()==2) return nums; //按二进制特征分两组 int ret=0; for(auto e:nums) { ret^=e; } //找二进制标志位为1代表两数不相等 int pos=0; for(int i=0;i<32;i++) { //cout<<((ret>>i)&1)<<endl; if(((ret>>i)&1)==1) { pos=i; break; } } cout<<pos<<endl; //分组 int num1=0; int num2=0; for(auto e:nums) { if(((e>>pos)&1)==0) num1^=e; else if(((e>>pos)&1)==1) num2^=e; } //分组^ return {num1,num2}; } };