Проблема
Ваш метод эквивалентно:
def sum_comparison(int_array, x)
return int_array[0].to_i + int_array[1].to_i == x
end
Таким образом,
int_array = [1,2,4,16,32,7,5,7,8,22,28]
sum_comparison(int_array, 3) #=> true, just lucky!
sum_comparison(int_array, 6) #=> false, wrong!
Alternative
Здесь является относительно эффективным РЕАЛИЗАЦИЯ, конечно, гораздо более эффективно, чем использование Enumerable#combination
.
Код
def sum_comparison(int_array, x)
sorted = int_array.sort
smallest = sorted.first
sorted_stub = sorted.take_while { |e| e+smallest <= x }
p "sorted_stub = #{sorted_stub}"
return false if sorted_stub.size < 2
loop do
return false if sorted_stub.size < 2
v = sorted_stub.shift
found = sorted_stub.find { |e| v+e >= x }
return true if found && v+found == x
end
false
end
Примеры
sum_comparison([7,16,4,12,-2,5,8], 3)
# "sorted_stub = [-2, 4, 5]"
#=> true
sum_comparison([7,16,4,12,-2,5,8], 7)
# "sorted_stub = [-2, 4, 5, 7, 8]"
#=> false
sum_comparison([7,16,4,22,18,12,2,41,5,8,17,31], 9)
# "sorted_stub = [2, 4, 5, 7]"
#=> true
Примечания
Линия p "sorted_stub = #{sorted_stub}"
включается просто для отображения массива sorted_stub
в примерах.
e+smallest > x
Если для любых элементов f
и g
в sorted
, для которых g >= e
и f < g
, f+g >= e+smallest > x
. Ergo, sorted_stub.last
- это самое большое значение в sorted
, которое необходимо учитывать.
Для заданного значения v
, линия found = sorted_stub.find { |e| v+e >= x }
останавливает поиск второго значения e
, для которого v+e = x
как только он находит e
такое, что v+e >= x
. Следующая строка затем определяет, найдено ли совпадение.
В чем Ваш вопрос? – sawa
Код, который я написал, не работает правильно, мне нужен кто-то, чтобы намекнуть, где ошибка – codingal
Как используется 'sum_comparison'? Что такое 'int_array_length'? – sawa