2014-10-24 3 views
1

Ошибка указана в строке 12, и я не уверен, почему я не могу добавить числа. Буду признателен за любую оказанную помощь. Инструкции: Напишите метод, который принимает массив чисел. Если пара чисел в массиве суммируется с нулем, верните позиции этих двух чисел. Если никакая пара чисел не суммируется с нулем, верните nil.Ruby: nil не может быть принудительно введен в Fixnum (TypeError)

def two_sum(nums) 
    idx1 = 0 
    idx2 = 1 
    while idx1 < nums.length 

    if nums[idx1] + nums[idx2] == 0 

     return [idx1, idx2] 

    end 
    idx2 += 1 
    if idx2 == nums.length 
     idx1 += 1 
     idx2 = idx1 + 1 
    end 
    end 
    return nil 
end 

puts("two_sum([1, 3, 5, -3]) == [1, 3]: #{two_sum([1, 3, 5, -3]) == [1, 3]}") 
puts("two_sum([1, 3, 5]) == nil: #{two_sum([1, 3, 5]) == nil}") 
+0

Для тех, кто найдет это " вопрос "по названию, если вы хотите преобразовать' nil' в Fixnum append '.to_i' на нем:' nil.to_i'. Поместите его на любую переменную, которую вы используете 'myvar.to_i'. Это преобразует 'nil' в' 0'. –

+0

Я попытался найти проблему, но не нашел свою конкретную проблему или был слишком невежествен, чтобы узнать ответ – ChrisWilson

ответ

2

idx2 может переполнить емкость вашего массива:

Imagine. nums = [1,2,3], так nums.length 3, idx1 = 1, idx2 = 2

idx2 += 1 # ok now idx2 is 3 
if idx2 == nums.length # ok true, idx2 == 3 
    idx1 += 1 # mmm, cool idx1 now 2 
    idx2 = idx1 + 1 # idx2 is 3 
end 

Таким образом, в следующей итерации вы будете называть

nums[idx2] 
# same as 
nums[3] 
# ERROR! there is only 3 numbers in nums 

И попытаться понять этот код

def two_sums(nums) 
    nums[0..-2].each.with_index do |n,i| 
    nums[i+1..-1].each.with_index do |m,j| 
     return [i, i+j+1] if m + n == 0 
    end 
    end 
    nil 
end 
+0

спасибо большое – ChrisWilson