每次遇得這種位操作的新題,都不會做。
很無奈。看了大神的講解才恍然大悟。
哎。
原理就是對數組進行分組,使得兩個單獨的數a、b被分到不同的組。再在不同的組裏面通過異或的操作分別得出兩個數。
怎麼樣分組呢? 尋找a與b的不同點。此時,不用考慮其他數,因爲其他數都是成雙的,相同的數一定會被分到同一組。
通過異或操作我們可以得到a與b不同的位。我們選取a^b的最低不爲0的位。
通過判斷每個數在該位上是否爲零,對數進行分組。
真的很妙。
code:
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
if (nums.size() < 3) return nums;
vector<int> res(2,0);
int diff = 0;
for (auto i : nums) diff ^= i;
diff &= -diff;
for (auto i : nums) {
if (i & diff) res[0] ^= i;
else res[1] ^=i;
}
return res;
}
};