2016-02-12 73 views
-2

我有一定数量。我想从第一个值开始迭代数组,如果我添加下一个值并且它等于数量,那么应该返回数组中的这两个值。如果它不等于该值,则尝试在该值之后添加下一个值,并检查它是否等于该值。迭代Array并添加每个连续的数组值

然后返回值的阵列,当加起来等于量

例如

可以说我有[1,2,3,4,7] 阵列和量6

我知道我可以做6加入1 + 2 + 3,所以我想返回[1,2,3]回来。

它是迭代通过数组的开始,然后检查是否添加下一个,如果它等于6,如果不是,尝试添加下一个也看到它等于6 ...等等,直到我得到值加在一起是做等于6

在换句话说找到这个阵,当加在一起构成了6

+0

我不知道该怎么去尝试我新的Ruby和我没有一个数组的任何元素的元素真正的好主意。这实际上是查找语言的第一天 – PositiveGuy

+0

查看算法的[coin问题](https://en.wikipedia.org/wiki/Coin_problem)。有一个很短的递归解决方案。 – sschmeck

+0

ok thx,我现在检查出来 – PositiveGuy

回答

2
arr = [1,2,3,4,7] 
tot = 6 

情况1:要被总计的元素是所述阵列的所述第一n元件

不是非常有效的,但读取以及:

idx = arr.size.times.find { |i| arr[0..i].reduce(:+) == tot } 
idx ? arr[0..idx] : nil 
    #=> [1, 2, 3] 

更有效的:

t = 0 
idx = arr.size.times.find { |i| t += arr[i]; t == tot } 
idx ? arr[0..idx] : nil 
    #=> [1, 2, 3] 

使用递归

def partial_sum(arr, remaining) 
    return nil if arr.empty? 
    first, *rest = arr 
    if remaining == first 
    [first] 
    else 
    ret = partial_sum(rest, remaining-first) 
    ret ? [first, *ret] : nil 
    end 
end 

partial_sum(arr, 6) 
    #=> [1, 2, 3] 
partial_sum(arr, 7) 
    #=> nil 

案例2:概括可以

def sum_subarrays(arr, tot) 
    (0...arr.size).each do |n| 
    b = arr.combination(n).find { |a| a.reduce(:+) == tot } 
    b ? (return b) : nil 
    end 
    nil 
end 

(1..17).each do |tot| 
    v = sum_subarrays(arr, tot) 
    puts "sum_subarrays(arr, #{tot}) = #{v ? v : 'nil'}" 
end 
sum_subarrays(arr, 1) = [1] 
sum_subarrays(arr, 2) = [2] 
sum_subarrays(arr, 3) = [3] 
sum_subarrays(arr, 4) = [4] 
sum_subarrays(arr, 5) = [1, 4] 
sum_subarrays(arr, 6) = [2, 4] 
sum_subarrays(arr, 7) = [7] 
sum_subarrays(arr, 8) = [1, 7] 
sum_subarrays(arr, 9) = [2, 7] 
sum_subarrays(arr, 10) = [3, 7] 
sum_subarrays(arr, 11) = [4, 7] 
sum_subarrays(arr, 12) = [1, 4, 7] 
sum_subarrays(arr, 13) = [2, 4, 7] 
sum_subarrays(arr, 14) = [3, 4, 7] 
sum_subarrays(arr, 15) = [1, 3, 4, 7] 
sum_subarrays(arr, 16) = [2, 3, 4, 7] 
sum_subarrays(arr, 17) = nil 
0

中的值试试这个:

array = [1,2,3,4,7] 
amount = 17 

master_array = (1..array.size).map { |i| array.each_slice(i).to_a } 

master_array.each.with_index do |e,i| 
    p e[0] if master_array[i][0].inject(:+) == amount 
end 
+0

p e [0]是什么?我不熟悉ruby语法 – PositiveGuy

+0

@WTF'p'是'inspect'方法的快捷方式。与数组一起使用时,它将返回数组。与'puts'比较,它会打印数组中的每个元素并返回'nil'。在这种情况下,'e'表示迭代中的当前元素,它也是一个数组。考虑数组e'[1,2,3],然后'e [0] = 1','e [1] = 2'和'e [2] = 3'。 –

+0

说实话,我对案例1的解决方案有点过于复杂。 @CarySwoveland拥有更清洁和更易读的案例1的解决方案。显然他被认为是更复杂的案例2。 –

相关问题