leetcode-Single Number III-260

输入一个数组,其中除了两个数只出现一次外,其余的数均出现两次,找出只出现一次的数

一个系列http://www.cnblogs.com/0summer/p/5830714.html

这类题都可用multiset来做,时间ON,不过空间也是ON

既然题目要求空间O1,说明肯定有规律

本题同样位运算,设结果为a,b

1.全部异或得到x

2.x肯定就是只出现一次的两个数的异或,而且二进制位为1的就是这两个数在二进制上不一样的

3.随便找一个x中二进制位为1的,将数组分为两部分,则a,b肯定在不同的两组,问题就转换成了一个数组中只有一个数出现一次,其余出现两次,所以两组内异或得到a,b

 1 class Solution {
 2 public:
 3     vector<int> singleNumber(vector<int>& nums) {
 4         int len=nums.size();
 5         vector<int> v;
 6         if(len<2) return v;
 7         int tmp=0;
 8         for(int i=0;i<len;i++) tmp^=nums[i];
 9         int cur=tmp;
10         int cnt=0;
11         while(cur){
12             cnt++;
13             int a=cur%2;
14             if(a) break;
15             cur/=2;
16         }
17         int one=0,two=0;
18         int k=pow(2,cnt-1);
19         for(int i=0;i<len;i++){
20             if(nums[i]&k) one^=nums[i];
21             else two^=nums[i];
22         }
23         v.push_back(one);
24         v.push_back(two);
25         return v;
26     }
27 };

 

转载于:https://www.cnblogs.com/0summer/p/5830756.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值