Найти дубликат в массиве 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