14. Non Repeating Numbers
The problem can be found at the following link: Question Link
My Approach
To solve this problem, I utilized bitwise XOR operations to find the non-repeating numbers. Here's the breakdown of my approach:
I started by XORing all the elements in the input array. Since XOR of two same values results in
0, this operation effectively gives me the XOR value of the two unpaired numbers.I then created a bitmask by finding the rightmost set bit in the XOR value. This was done through bit manipulation, where I shifted the mask to the left until the XOR value's rightmost bit was set.
Using this bitmask, I looped through the input array again. For each number, I checked whether the corresponding bit in the bitmask was set or unset. Based on this, I separated the numbers into two groups: those with the bit set and those with the bit unset.
Finally, I XORed all the numbers in each group separately to find the two non-repeating numbers.
Explanation with Example
Consider the input array [1, 2, 3, 2, 1, 4].
XORing all elements gives
3 ^ 4, which is7(binary111).Then, I find the rightmost set bit, which is at the first position (from the right) in the binary representation of
7. This gives me the bitmask001.
Now I separate the elements based on the bitmask:
Elements with set bit (
001):[1, 3, 1]Elements with unset bit:
[2, 2, 4]
After XORing the elements in each group:
XOR of elements with set bit:
1 ^ 3 ^ 1 = 3XOR of elements with unset bit:
2 ^ 2 ^ 4 = 4
So, the two non-repeating numbers are 3 and 4.
Time and Auxiliary Space Complexity
Time Complexity: The algorithm iterates through the input array twice. Both iterations are linear, so the overall time complexity is
O(n).Auxiliary Space Complexity: The algorithm uses a constant amount of extra space for variables and containers. Hence, the auxiliary space complexity is
O(1).
Code (C++)
class Solution {
public:
vector<int> singleNumber(vector<int> nums)
{
int xorVal = 0;
for(auto num: nums){
xorVal ^= num; // Xor of two same values = 0, so after this operation we get xor value of two unpaired numbers.
}
int mask = 1;
while(!(xorVal & 1)){ // Making bit mask of rightmost set bit
mask <<= 1;
xorVal >>= 1;
}
vector<int> out(2,0);
for(auto num: nums){
if((mask & num)) // All value who have set bit stored in out[0];
out[0] ^= num;
else // All values who have unset bit stored in out[1];
out[1] ^= num;
}
sort(out.begin(),out.end());
return out;
}
};Contribution and Support
For discussions, questions, or doubts related to this solution, please visit our discussion section. We welcome your input and aim to foster a collaborative learning environment.
If you find this solution helpful, consider supporting us by giving a ⭐ star to the getlost01/gfg-potd repository.
Last updated
Was this helpful?