-
Notifications
You must be signed in to change notification settings - Fork 39
/
Copy pathsingle_number_iii.rb
40 lines (36 loc) · 981 Bytes
/
single_number_iii.rb
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
37
38
39
40
# https://leetcode.com/problems/single-number-iii/
#
# 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].
#
# Notes:
#
# + 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?
#
# Credits:
#
# Special thanks to @jianchao.li.fighter for adding this problem and
# creating all test cases.
# @param {Integer[]} nums
# @return {Integer[]}
def single_number(nums)
n1_xor_n2 = nums.reduce(&:^)
last_1bit = n1_xor_n2 - (n1_xor_n2 & (n1_xor_n2 - 1))
n1, n2 = 0, 0
nums.each do |num|
if num & last_1bit == 0
n1 ^= num
else
n2 ^= num
end
end
[] << n1 << n2
end