You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

35 lines
1.2 KiB
Ruby

5 years ago
# Given an array where all elements appear even number of times except one.
# All repeating occurrences of elements appear in pairs and these pairs are not adjacent (there cannot be more than two consecutive occurrences of any element).
# Find the element that appears odd number of times.
# Note that input like {2, 2, 1, 2, 2, 1, 1} is valid as all repeating occurrences occur in pairs and these pairs are not adjacent.
# Input like {2, 1, 2} is invalid as repeating elements dont appear in pairs. Also, input like {1, 2, 2, 2, 2} is invalid as two pairs of 2 are adjacent.
# Input like {2, 2, 2, 1} is also invalid as there are three consecutive occurrences of 2.
#Time-complexity: O(logn),Auxiliary-space:O(1)
#Algorithm:Binary-search
def search_odd(a)
lo=0
hi=a.length-1
while hi-lo>1
mid=lo+(hi-lo)/2
if mid%2==0
if a[mid]==a[mid+1]
lo=mid+2
else
hi=mid
end
else
if a[mid]==a[mid-1]
lo=mid+1
else
hi=mid
end
end
end
return a[lo]
end
search_odd([3,1, 1, 2, 2, 3, 3, 4, 4,600, 600, 4, 4]) # => [3]