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.
For example:
Given
nums = [1, 2, 1, 3, 2, 5]
, return [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?
Code (Java):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | public class Solution { public int [] singleNumber( int [] nums) { if (nums == null || nums.length == 0 ) { return new int [ 0 ]; } int xor = 0 ; // Step 1: calculate the xor for all numbers // So the result is the xor of the two single numbers for ( int num : nums) { xor ^= num; } // Step 2: find the first bit 1 from right int mask = 1 ; while ((mask & xor) == 0 ) { mask = mask << 1 ; } int xor1 = 0 ; int xor2 = 0 ; for ( int num : nums) { if ((num & mask) == 0 ) { xor1 ^= num; } else { xor2 ^= num; } } int [] result = new int []{xor1, xor2}; return result; } } |
No comments:
Post a Comment