https://leetcode-cn.com/problems/single-number-iii/
有两个数字只出现了一次 其余数字都是出现了两次
思路 相同数字异或为0 所有数字异或结果必不为0
异或结果取最后一位1 说明两个数在这一位不相同(这一步思路很巧妙 t&(-t)-t是t取反后加1 正好可以取得最后一位1
用上一步取得的1去进行&运算 这一位是1的 放到一边 这一位是0的放到一边 这两个数必定一个在一遍 得到答案
#include <bits/stdc++.h> using namespace std; typedef long long ll; class Solution { public: vector<int> singleNumber(vector<int>& nums) { ll t=0;//用来异或 for(ll i:nums){ t^=i; } ll last1=t&(-t);//获得最后一位1 vector<int> ans(2,0); for(int i:nums){ if(i&(last1)){ ans[0]^=i; } else{ ans[1]^=i; } } return ans; } };
Comments | NOTHING