Advertisement
exmkg

1-4

Jan 14th, 2025
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.64 KB | None | 0 0
  1. class Solution {
  2.     public int singleNumber(int[] nums) {
  3.         // XOR operation – "exclusive OR"
  4.         // Defined: "If only one of them is true,
  5.         // the result is true; otherwise, false."
  6.         // 0 ^ 0 = 0
  7.         // 0 ^ 1 = 1
  8.         // 1 ^ 0 = 1
  9.         // 1 ^ 1 = 0
  10.  
  11.         // XOR operation on two 32-bit integers
  12.         // 0000...0001100  a = 12
  13.         // 0000...0001010  b = 10
  14.         // --------------
  15.         // 0000...0000110  a ^ b = 6
  16.         // ^ this is XOR operation in C++ / Java.
  17.  
  18.         // 1. A property of XOR operation is that
  19.         // a^a = 0, i.e. XOR-ing two equal numbers
  20.         // gives a 0 result.
  21.  
  22.         // More properties:
  23.         // 2. (a^b)^c = a^(b^c)
  24.         // 3. a^b = b^a
  25.  
  26.         // Examples:
  27.         //  1. 0^0 = 0
  28.         //  2. 0^0^0 = 0
  29.         //  3. 0^0^a = a
  30.         //  4. 0^a = a
  31.         //  5. a^a = 0
  32.         //  6. a^a^b = (a^a)^b = 0^b = b (Example 1: 2^2^1 = 1)
  33.         //  7. a^b^a = a^a^b = b
  34.         //  8. a^b^c^a = (a^a)^b^c = 0^b^c = b^c
  35.         //  9. c^a^b^a^b = c^(a^a)^(b^b) = c^0^0 = c (Example 2: 4^1^2^1^2 = 4)
  36.         // 10. a^b^c^a^b^c^d = (a^a)^(b^b)^(c^c)^d = 0^0^0^d = d
  37.         //   [1,2,3,1,2,3,4] => 1^2^3^1^2^3^4 = (1^1)^(2^2)^(3^3)^4 = 0^0^0^4
  38.         //                                                          = 4
  39.         // 11. [a, b, c, a, b] -> (a ^ b ^ c ^ a ^ b) will give
  40.         //    as a result of (c) because twin a's, b's
  41.         //    will cancel each other.
  42.  
  43.         // My example: [1, 2, 3, 1, 2, 4, 3] => ans should be 4 because
  44.         //                                        1^2^3^1^2^4^3
  45.         //                                      = (1^1)^(2^2)^(3^3)^4
  46.         //                                      = 0^0^0^4
  47.         //                                      = 4
  48.         // Let ans = 0. Iterate over nums array like `for (int x : nums)`
  49.         //              and compute ans = ans ^ x;
  50.         //    ans ^  x  = new_ans
  51.         // 1: 000 ^ 001 =   001              ans (0) ^ X (1) = new_ans (1)
  52.         // 2: 001 ^ 010 =   011              ans (1) ^ X (2) = new_ans (3)
  53.         // 3: 011 ^ 011 =   000              ans (3) ^ X (3) = new_ans (0)
  54.         // 1: 000 ^ 001 =   001              ans (0) ^ X (1) = new_ans (1)
  55.         // 2: 001 ^ 010 =   011              ans (1) ^ X (2) = new_ans (3)
  56.         // 4: 011 ^ 100 =   111              ans (3) ^ X (4) = new_ans (7)
  57.         // 3: 111 ^ 011 =   100              ans (7) ^ X (3) = new_ans (4)
  58.         // Finally, ans = 4 as expected.
  59.  
  60.         int answer = 0;
  61.         for (int x : nums) {
  62.             answer ^= x;
  63.         }
  64.         return answer;
  65.     }
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement