Find the Only Non Repeating Element Using XOR in DSA Python - Time & Space Complexity
We want to know how fast we can find the single number that appears only once in a list where every other number appears twice.
How does the time needed change as the list gets bigger?
Analyze the time complexity of the following code snippet.
def find_unique(arr):
result = 0
for num in arr:
result ^= num
return result
This code finds the only number that does not repeat by using XOR on all elements.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: XOR operation inside a single loop over the array.
- How many times: Once for each element in the array (n times).
As the list grows, the number of XOR operations grows directly with the number of elements.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 XOR operations |
| 100 | 100 XOR operations |
| 1000 | 1000 XOR operations |
Pattern observation: The work grows in a straight line with the input size.
Time Complexity: O(n)
This means the time to find the unique number grows directly with the number of elements in the list.
[X] Wrong: "Since XOR is a bitwise operation, it must be constant time regardless of input size."
[OK] Correct: While XOR itself is fast, it is done once per element, so total time depends on how many elements there are.
Understanding this approach shows you can use clever tricks to solve problems efficiently, a skill valued in many coding challenges.
"What if the array was sorted? Could we find the unique element faster than O(n)?"
Practice
Solution
Step 1: Understand XOR property for identical numbers
XOR of a number with itself always results in 0 because bits cancel out.Step 2: Apply XOR to example
For example, 5 XOR 5 = 0.Final Answer:
It returns 0 -> Option BQuick Check:
5 ^ 5 = 0 [OK]
- Thinking XOR returns the number itself
- Confusing XOR with OR
- Assuming XOR sums numbers
arr in Python?Solution
Step 1: Initialize result to 0 for XOR operation
Start with 0 because XOR with 0 returns the number itself.Step 2: Use ^= operator to XOR each element
Loop through each number and XOR it with the result to accumulate the XOR of all elements.Final Answer:
result = 0 for num in arr: result ^= num -> Option CQuick Check:
Use ^= for XOR accumulation [OK]
- Using + instead of ^
- Starting result with 1
- Using |= instead of ^=
arr = [2, 3, 5, 4, 5, 3, 4]
result = 0
for num in arr:
result ^= num
print(result)Solution
Step 1: XOR all elements step-by-step
Start with result=0. XOR with 2 -> 2, XOR with 3 -> 1, XOR with 5 -> 4, XOR with 4 -> 0, XOR with 5 -> 5, XOR with 3 -> 6, XOR with 4 -> 2.Step 2: Final XOR value is the non-repeating element
The final result after XORing all elements is 2, which appears only once.Final Answer:
2 -> Option AQuick Check:
Only 2 is non-repeating, XOR result = 2 [OK]
- Not XORing all elements
- Confusing output with repeated numbers
- Assuming sum instead of XOR
def find_unique(arr):
result = 1
for num in arr:
result ^= num
return result
print(find_unique([1, 2, 2, 1, 3]))Solution
Step 1: Check initialization of result
Result must start at 0 because XOR with 0 returns the number itself. Starting at 1 changes the result incorrectly.Step 2: Verify loop and XOR usage
The loop and XOR operator are correct; only initialization is wrong.Final Answer:
result should be initialized to 0, not 1 -> Option DQuick Check:
Initialize XOR accumulator with 0 [OK]
- Starting result at 1
- Replacing XOR with addition
- Changing loop range incorrectly
Solution
Step 1: Use XOR properties for pairs
XOR of two identical numbers is 0, so pairs cancel out when XORed.Step 2: XOR all elements starting from 0
Starting with 0, XOR all elements leaves only the unique element because pairs vanish.Step 3: Compare with other methods
Sorting or dictionary methods work but are less efficient in time or space.Final Answer:
Initialize result to 0 and XOR it with every element in the array -> Option AQuick Check:
XOR all elements starting at 0 for unique element [OK]
- Using sorting which is slower
- Using extra space with dictionary
- Incorrect arithmetic approach
Ready to prove it?
Pass the test and this pattern moves unknown
