Кажется, я где-то слышал, что решение Ruby подойдет, поэтому я дам два, но если Ruby находится в черном списке, по крайней мере один из методов можно легко перевести на язык, указанный в утвержденный список (знание Ruby не требуется). Первый метод использует наборы, которые Ruby реализует с помощью хешей под крышкой. Второй метод использует хеши. Я предоставил последнее, если выбранный язык не поддерживает заданные объекты.
Главное - использовать метод, близкий к O (n) по вычислительной сложности, где n
- это сумма размеры двух массивов. Я говорю «близко к» O (n), потому что методы, которые я предлагаю, используют хеши, прямо или косвенно, и поиск ha sh не совсем O (1). Традиционный подход к этой проблеме, перечисление второго массива для каждого элемента первого, и наоборот, имеет вычислительную сложность O (n 2 ).
Нам даны два массивы:
arr1 = ["57", "11", "13", "3", "889", "014", "91"]
arr2 = ["003", "889", "13", "14", "57", "12", "90"]
Использовать наборы
require 'set'
def not_in_other(a1, a2)
st = a2.map(&:to_i).to_set
a1.reject { |s| st.include?(s.to_i) }
end
not_in_other(arr1, arr2) + not_in_other(arr1, arr2)
#=> ["11", "91", "11", "91"]
Примечание:
a = arr2.map(&:to_i)
#=> [3, 889, 13, 14, 57, 12, 90]
a.to_set
#=> #<Set: {3, 889, 13, 14, 57, 12, 90}>
Использовать хэши
Шаг 1: Создайте ha sh для каждого массива
def hashify(arr)
arr.each_with_object({}) { |s,h| h[s.to_i] = s }
end
h1 = hashify(arr1)
#=> {57=>"57", 11=>"11", 13=>"13", 3=>"03", 889=>"889",
# 14=>"014", 91=>"91"}
h2 = hashify(arr2)
#=> {3=>"003", 889=>"889", 13=>"13", 12=>"12", 14=>"14",
# 57=>"57", 90=>"90"}
Значение этих хэшей (чьи ключи являются целыми числами) должно быть самоочевидным.
Шаг 2: Определите, какие ключи в каждом га sh отсутствуют в другом га sh
keys1 = h1.keys
#=> [57, 11, 13, 3, 889, 14, 91]
keys2.keys
#=> [3, 889, 13, 12, 14, 57, 90]
keepers1 = keys1.reject { |k| h2.key?(k) }
#=> [11, 91]
keepers2 = keys2.reject { |k| h1.key?(k) }
#=> [12, 90]
В качестве альтернативы можно написать:
keepers1 = keys1 - keys2
keepers2 = keys2 - keys1
Я ожидаю, что это будет O (n), но это будет зависеть от реализации.
Шаг 3: Получите значения h1
для ключей keepers1
и h2
для ключей keepers2
, и объединить их
h1.values_at(*keepers1) + h2.values_at(*keepers2)
#=> ["11", "91", "12", "90"]