Arrays 迭代数组并添加每个连续的数组值
我有一笔钱。我想从第一个值开始迭代数组,如果我加上下一个值,它等于amount,那么应该返回数组中的这两个值。如果它不等于该值,请尝试在该值之后添加下一个值,并检查它是否等于该值 然后返回值的数组,这些值加起来等于数量 范例 假设我有一个Arrays 迭代数组并添加每个连续的数组值,arrays,ruby,Arrays,Ruby,我有一笔钱。我想从第一个值开始迭代数组,如果我加上下一个值,它等于amount,那么应该返回数组中的这两个值。如果它不等于该值,请尝试在该值之后添加下一个值,并检查它是否等于该值 然后返回值的数组,这些值加起来等于数量 范例 假设我有一个[1,2,3,4,7] 以及金额6 我知道我可以通过加1+2+3得到6,所以我想返回[1,2,3] 迭代数组的开头,然后检查下一个是否等于6,如果不等于6,试着加上下一个,然后看到它等于6…以此类推,直到我得到的值加在一起等于6 换言之,在这个数组中找到加在一起
[1,2,3,4,7]
以及金额6
我知道我可以通过加1+2+3得到6,所以我想返回[1,2,3]
迭代数组的开头,然后检查下一个是否等于6,如果不等于6,试着加上下一个,然后看到它等于6…以此类推,直到我得到的值加在一起等于6
换言之,在这个数组中找到加在一起构成6的值。试试这个:
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
情况1:要求和的元素是数组的第一个n
元素
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
效率不高,但读起来很好:
更有效率:
使用递归
情况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
我不知道该怎么做我对ruby还不熟悉,也没有什么好主意。这是查找语言的第一天,请看一下算法的详细信息。有一个很短的递归解决方案。好的,thx,我现在用数组
[1,2,3,4,7]
和值6
,你如何决定返回[1,2,3]
,而不是[1,1,1,3]
或[1,1,1,1,1,1]
?@Jordan不知道,非常好的问题:)一个我正在试图弄清楚什么是p[0]?我对ruby不太熟悉syntax@WTFp
是inspect
方法的快捷方式。与数组一起使用时,它返回数组。与put
比较,后者将打印数组的每个元素并返回nil
。在本例中,e
表示迭代中的当前元素,它也是一个数组。e[0]表示法打印索引为0的数组元素。考虑数组<代码> e=(1, 2, 3)< /代码>,然后<代码> e [ 0 ]=1 < /代码>,<代码> e [ 1 ]=2 < /代码>和<代码> E[2 ]=3 < /代码>。老实说,我对案例1的解决方案有点过于复杂。CarySwoveland有一个更干净、更容易阅读案例1的解决方案。显然他考虑了更复杂的案例2。
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
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