2017-01-17 80 views
0

我需要查找給定數組中的第一個組合,並將它們加起來成爲特定值。組合需要作爲一個整體的最低索引組合。如何找到添加到特定值的子陣列的所有組合

我大部分的問題制定出:

def pairs(array_ints, sum) 
    array_ints.combination(2).detect {|x, y| x + y == sum} 
end 

這種方法不具有最低索引對給組合。例如:

def pairs([10, 5, 2, 3, 7, 5], 10) 
    array_ints.combination(2).detect {|x, y| x + y == sum} 
end  

#output [5, 5] 
#desired output [3, 7] because they appear earlier as a pair in the array. 

如何輸出等於特定總和並選擇最低索引對的所有對?

+0

是單項目排除?是否允許兩個以上的項目?鄰接關係如同你的3,7例子嗎? – coreyward

+0

排除單個項目。超過兩個項目是不允許的。他們不必相鄰。我關心的指數是這對貨幣中的第二個數字。它需要是最低的。 –

回答

0

考慮到從評論中的約束:他們不必是相鄰的。我關心的指數是這對貨幣中的第二個數字。它需要是最低的。

def pairs(array_ints, sum) 
    array_ints.combination(2).inject({}) do |acc, pair| 
    first, second = pair 

    # 
    # Find the last occurrence of the second element. Note the use of 
    # 'rindex' to search from the end of the array. The same element 
    # may occur more than once ... 
    # 
    index = array_ints.rindex(second) 

    if first + second == sum 
     if !acc[:index] || acc[:index] > index 
     # Store the first match, or replace it if the stored 
     # index is higher than the current index 
     acc[:result] = pair 
     acc[:index] = index 
     end 
    end 

    acc 
    end.fetch(:result, []) 
end 

describe "pairs" do 
    let(:array) { [10, 5, 2, 3, 7, 5] } 

    describe "when there are multiple combinations that add up to the sum" do 
    it "finds the pair having the lowest index of the second element in the pair" do 
     expect(pairs(array, 10)).to eq([3,7]) 
     expect(pairs(array, 8)).to eq([5,3]) 
    end 
    end 

    describe "when there is no combination matching the sum" do 
    it "returns an empty array" do 
     expect(pairs(array, 1)).to eq([]) 
    end 
    end 

end 
0

array_ints = [10,5,2,3,7,5,8,2]總和= 10

def pairs(array_ints, sum) 
arr = [] 
array_ints.each_cons(2){|x,y| arr.push(x,y) if x+y==sum } 
print arr.first(2) 
end 

# output [3, 7] 
相關問題