leetcode 136 231
class Solution { public: int singleNumber(vector<int>& nums) { int s = nums[0]; for(int i=1; i<nums.size(); i++){ s = s ^ nums[i]; } return s; } };
题意:数组里只有两个出现一次的数,其余是出现两次的数,找出这两个只出现一次的数。
思路:延续上一题的思路,先将所有数相异或,因为相同的数异或为0,所以异或的结果为两个只出现一次的数异或后的结果。然后使用 res = s & (~(s-1)) 从中取出二进制数值位为1的最低位。因为对于这一位,相应的那两个数肯定是不同的。然后将res再与数组里的数与,会得到一组值为0,和一组值不为0的两堆,而这两个数肯定是分开出现在两堆的。最后将这两堆分别做异或操作,得到的值就是只出现一次的数。
注意:运算符的优先级,& 优先级小于 ==
class Solution { public: vector<int> singleNumber(vector<int>& nums) { int s = 0; for(int i=0; i<nums.size();i++){ s ^= nums[i]; } int res = s & (~(s-1)); vector<int> n(2,0); for(int i=0; i<nums.size();i++){ if( (res&nums[i])==0){ n[0] ^= nums[i]; } else{ n[1] ^= nums[i]; } } return n; } };