@ aimen_alt прав насчет вашей ошибки
но давайте разберем вашу проблему.
Во-первых, вам нужно рассчитать внешний вид каждого числа.
Во-вторых, вам нужно найти тот, у которого нечетное количество появлений.
В соответствии с проблемой, существует только один такой номер, поэтому вы можете вернуть его сразу.
Вы можете пойти своим путем и сделать это в O(N^2)
сложности, отсканировав свою последовательность для каждого элемента в последовательности (поэтому N
элементов в последовательности умножаются на размер последовательности N
= N*N
) , Вы можете сделать это линейно *, построив Hash
, и тогда вы сможете получить ключ с нечетным значением:
def find_it(seq)
numbers = {}
seq.each do |item|
numbers[item] = numbers[item].to_i + 1
end
numbers.select{ |k,v| v.odd? }.first.first
end
чтобы быть более идиоматическим, вы можете использовать group_by
для группировки самих чисел:
seq = [1, 2, 6, 1, 2]
seq.group_by{ |item| item }
#=> {1=>[1, 1], 2=>[2, 2], 6=>[6]}
Вы можете видеть, что каждое значение является массивом, и вам просто нужно получить одно с нечетным количеством элементов:
seq = [1, 2, 6, 1, 2]
seq.group_by{ |item| item }.select{ |k, v| v.size.odd? }
#=> {6=>[6]}
И последнее, что вы хотели бы сделать, это получить значение ключа:
seq.group_by{ |item| item }.select{ |k, v| v.size.odd? }.keys.first
Итак, окончательное решение будет
def find_it(seq)
seq.group_by{ |item| item }
.select{ |k, v| v.size.odd? }
.keys
.first
end
как упомянул @pascalbetz:
def find_it(seq)
seq.group_by{ |item| item }
.find{ |k, v| v.size.odd? }
.first
end