Single Number III
Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.
Example:
Input: [1,2,1,3,2,5]
Output: [3,5]
Note:
- The order of the result is not important. So in the above example, [5, 3] is also correct.
- Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?
分析:
本题是有两个未知数,是 "Single Number" 这道题的扩展,直接做异或肯定是不行的。有没有办法把两个未知数分开,使得可以应用Single Number 的解法呢?
设x, y是那两个未知数,那么如果对这个数组做异或的话,结果实质上等于x ^ y,因为其他数都出现了两次,被抵消了。
但是仅仅是通过最后异或出来的值,是没办法区分出x和y的,但是足以帮助我们把x和y划分到不停地子数组中去。对于x和y,由于二者不相等,那么二者至少存在一位不相同。![]()
当找到这个k以后,就可以按照第k位是否等于1,将nums数组划分为两个子数组,然后把Single Number的算法直接应用到两个子数组上,就可以求出x和y了。
vector<int> singleNumber(vector<int>& nums) {
int aXorb = 0; // the result of a xor b;
for (auto item : nums) aXorb ^= item;
int lastBit = (aXorb & (aXorb - 1)) ^ aXorb; // the last bit that a diffs b
int intA = 0, intB = 0;
for (auto item : nums) {
// based on the last bit, group the items into groupA(include a) and groupB
if (item & lastBit) intA = intA ^ item;
else intB = intB ^ item;
}
return vector<int>{intA, intB};
}