p69 只出现一次的数字III (leetcode260)
一:解题思路
之前做了一道单数数字的题目,是每个数字出现了2次,只有一个数字只出现1次。你要找到那个只出现1次的数字。那么这道题目是否可以采用那道题目比较高效的解法呢?之前那道题目比较高效的解法是异或。当然,这道题目可以借鉴里面的思想在里面。可以把这个两个单身数字分别放在两组里面,然后每组进行累加异或就可以得到最后的结果。Time:O(n),Space:O(1)
二:完整代码示例 (C++版和Java版)
C++98/03:
class Solution { public: vector<int> singleNumber(vector<int>& nums) { vector<int> ret; if (nums.size() == 0) return ret; int xorValue = 0, mask = 1; for (int i = 0; i < nums.size(); i++) { xorValue ^= nums[i]; } while ((xorValue&mask) == 0) mask <<= 1; int x = 0, y = 0; for (int i = 0; i < nums.size(); i++) { if ((nums[i] & mask) == 0) x ^= nums[i]; else y ^= nums[i]; } ret.push_back(x); ret.push_back(y); return ret; } };
C++11:
class Solution { public: vector<int> singleNumber(vector<int>& nums) { vector<int> ret; if (nums.size() == 0) return ret; int xorValue = 0, mask = 1; for (auto it : nums) xorValue ^= it; while ((xorValue&mask) == 0) mask <<= 1; int x = 0, y = 0; for (auto it : nums) { if ((it&mask) == 0) { x ^= it; } else { y ^= it; } } ret = {x,y}; return ret; } };
Java:
class Solution { public int[] singleNumber(int[] nums) { int xorValue=0,mask=1; for(int num:nums) xorValue^=num; while((xorValue&mask)==0) mask<<=1; int x=0,y=0; for(int num:nums) { if((num&mask)==0) { x^=num; } else { y^=num; } } return new int[]{x,y}; } }

浙公网安备 33010602011771号