2017-06-05 21 views
1

我的目标是写一个方法,trickysum(n)执行以下操作:如何在不更改原始数组的情况下复制和删除数组?

该方法取数字1到n的范围。然后该方法找到该范围内符合棘手条件的数字对:该对数字的乘积必须等于范围内所有数字的总和,不包括该对。该方法然后返回符合此限定条件的所有数字对。这里是期待:

trickysum(26) 
    #=>[(15, 21), (21, 15)] 

这里是代码我到目前为止:

def trickysum(n) 

result = [] 
arr = (1..n).to_a 

0.upto(arr.length - 1) do |x| 

    0.upto(arr.length - 1) do |y| 

    prod = arr[x] * arr[y] 
    #I create a new array to delete from to not affect the original 
    #array. Would also love an easier way to do this :) 
    new_arr = arr 
    new_arr.delete(new_arr[x]) 
    new_arr.delete(new_arr[y]) 
    sum = new_arr.inject(:+) 
    if sum == prod 
     result << "(#{arr[x]},#{arr[y]})" 
    end 
    end 
end 

result 

end 

我一遍又一遍地看着此代码,想不通为什么我得到的以下错误:

nil can't be coerced into Fixnum 
(repl):7:in `*' 
(repl):7:in `block (2 levels) in trickysum' 
(repl):6:in `upto' 
(repl):6:in `block in trickysum' 
(repl):5:in `upto' 
(repl):5:in `trickysum' 
(repl):20:in `<main>' 

我在哪里出错了?

+0

这里有一个更好的算法。设S是1到n的和。那么你想'x * y = S-x-y'。这可以重新排列为'(x + 1)*(y + 1)= S + 1'。所以如果'S'是复合的,只需找到适当的除数对'S'。 –

+0

当问一个问题时,我们需要一个更好的标题,一个“如何”做些事情。 –

+0

@RoryDaulton'(31,10)'如何解决?大卫在范围内清楚地表明了“1到** n **”(在这种情况下,“n == 26”)。 –

回答

3

替换:

new_arr = arr 

有了:

new_arr = arr.dup 

这里发生的事情是,你所创建的arr变量的浅拷贝。如果没有明确地复制该值,则new_arrarr在内存中共享相同的位置。

正因为如此,当你调用new_arr.delete(new_arr[x])new_arr.delete(new_arr[y]),不仅是你的变异新阵列,也之一。

这意味着arr的长度变短了,所以你的外环超出了它的最终值,你得到了nil;因此错误。


虽这么说,我会完全不同的写了这个方法,这将避免这种细微的错误:

def trickysum(n) 
    sum = (1..n).inject(:+) 
    (1..n).combination(2).select do |a, b| 
    (a * b) + a + b == sum 
    end 
end 

Ruby是一个非常表现语言。如果你发现自己在循环中循环,声明临时变量并追加到结果数组中......那么可能有一个更优雅的解决方案:)

+0

\ *请注意,“我的解决方案”可能并非完全符合您的要求......数字的“对”可以相同,还是必须是唯一的?如果'[4,6]'是一个解决方案,那么'[6,4]'真的是一个你想要返回的独立解决方案吗? (这似乎有点不必要......)最后,我返回了一个数组数组,而您正在返回一个* Strings *(?!)数组。 –

+0

谢谢!这非常有帮助,并且肯定回答了我的问题。我是ruby的新手(仅有少数几个月),所以我习惯于使用相当简单的技术。我遵循你的代码,但有一个问题:在你的块中,(a * b)+ a + b ==和如何检查它是否等于需求?不过,我想这更像是一个数学问题。 –

+0

@DavidWebster *“这对数字的乘积必须等于范围内所有数字的总和,不包括这对”* ...换句话说,“a * b == sum - a - b” 。重新排列方程,你会得到什么? –

相关问题