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.

52 lines
1.4 KiB
Ruby

# Problem:
=begin
Given an array of size N ,taht has elements in range 1 to N ,all elements in the arrayb are unique,
Find the missing number.
e.g.
array = [1,5,2,4,6]
answer = 3
=end
#Approach 1 - Find the sum of all elements of array and substract it from sum of the range , the difference will be missing number.
# Time-complexity = O(n)
#Caveats: If the numbers are very large the sum can lead to integer overflow.
def find_missing_number(a)
n = a.length+1
range_sum = (n * (n+1))/2 # Sum of numbers from 1 to n is (n* n+1 )/2
arr_sum = 0
for x in a
arr_sum+=x
end
return missing_element = range_sum - arr_sum
end
#Approach 2 (No integer overflow)- Take bitwise XOR of all elements of the array with the numbers in given range,
#As( a XOR a == 0 ) all numbers present in array will xor out and become zero except the missing number.
# Time-complexity = O(n)
def find_missing_number(a)
n = a.length+1
missing_element = 0
(1..n).each {|num| missing_element^= num}
for x in a
missing_element^=x
end
return missing_element
end
#Ruby magic
#One line code but it uses O(n) auxiliary-space, it returns an array containing only the missing_element
# Array1-Array2 in ruby returns an array containing all the elements that are in Array1 but not in Array2
def find_missing_number(a)
n = a.length+1
range = Array (1..n)
missing_element = range-a
end