迭代数组并添加每个连续的数组值

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

然后返回加起来的值数组等于数量

假设我有一个[1,2,3,4,7]6的数组

我知道我可以通过添加1 + 2 + 3来制作6,所以我想返回[1,2,3]

它是迭代数组的开始,然后检查我是否添加下一个如果它等于6,如果没有,尝试添加下一个并看到它等于6 ……依此类推,直到我得到的值为加在一起等于6。

换句话说,找到这个数组中加起来的值组成6。

 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 

试试这个:

 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| pe[0] if master_array[i][0].inject(:+) == amount end