2016-02-12 34 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。 –

相關問題