Найти дубликат в массиве Ruby
Я пытаюсь найти повторяющиеся значения в массиве строк от 1 до 1000000.
Однако, с кодом, который у меня есть, я получаю вывод как все записи, которые удваиваются.
Так, например, если у меня есть [1,2,3,4,3,4]
, он дает мне результат 3 4 3 4 вместо 3 4.
Вот мой код:
array = [gets]
if array.uniq.length == array.length
puts "array does not contain duplicates"
else
puts "array does contain duplicates"
print array.select{ |x| array.count(x) > 1}
end
Кроме того, каждый раз, когда я тестирую свой код, я должен определить массив как array = [1,2,3,4,5,3,5]
. puts
работает, но не печатает, когда я использую массив [gets].
Может ли кто-нибудь помочь мне решить эти две проблемы?
Ответы
Ответ 1
Array#difference
снова приходит на помощь. (Я признаю, что ответ @user123 более прост, если вы не притворяетесь, что Array#difference
уже является встроенным методом. Array#difference
, вероятно, более эффективен из двух, поскольку он избегает повторных вызовов count
.) См. Мой ответ здесь для описания метода и ссылок на его использование.
В двух словах он отличается от Array # -, как показано в следующем примере:
a = [1,2,3,4,3,2,4,2]
b = [2,3,4,4,4]
a - b #=> [1]
a.difference b #=> [1, 3, 2, 2]
Однажды я бы хотел увидеть его как встроенный.
Для данной проблемы, если:
arr = [1,2,3,4,3,4]
повторяющиеся элементы задаются:
arr.difference(arr.uniq).uniq
#=> [3, 4]
Ответ 2
puts "Enter array"
array = gets.chomp.split(",").map(&:to_i)
if array.uniq.length == array.length
puts "array does not contain duplicates"
else
puts "array does contain duplicates"
print array.select{ |x| array.count(x) > 1}.uniq
end
скопируйте этот код в рубиновый файл и попробуйте запустить с помощью
ruby file_name.rb
Ответ 3
Для вашей первой проблемы вам понадобится uniq
функция, например
array.select{ |x| array.count(x) > 1}.uniq
Для вашей второй проблемы, когда вы получаете значение с помощью array = [gets]
, он будет получать всю вашу последовательность чисел массива как одну строку, поэтому все будет храниться в a[0]
, как ["1, 2 3 4\n"]
.
Ответ 4
Приступая к вашей проблеме "получить",
Когда вы делаете get, вы в основном получаете строку как вход, но не массив.
2.2.0 :001 > array = [gets]
1,2,1,4,1,2,3
=> ["1,2,1,4,1,2,3\n"]
См. приведенный выше пример, как интерпретатор ruby взял все ваши элементы как одну строку и поместил его в массив как один элемент массива. Поэтому вам нужно явно преобразовать вход в массив с запятой в качестве разделителя. Ниже приведены оба вопроса.
array = gets.chomp
array = array.split(',').map(&:to_i)
if array.uniq.length == array.length
puts "array does not contain duplicates"
else
puts "array does contain duplicates"
print array.select{ |x| array.count(x) > 1}.uniq!
end