2016-06-30 52 views
0

我正在嘗試一個編碼問題,如果任何連續數組數字的總和等於給定數字,要求我輸出「YES」,如果不是,則輸出「NO」。如何確定任何給定的連續數組元素的和是否等於ruby中給定的數字?

下面是問題: Prateek想在他的生日當天派對他的N個朋友,每個朋友的編號從1到N.他的朋友要求送禮物來參加聚會,而不是給他一個。禮物的成本在價值列表中給出,其中朋友要求有Costi費用的禮物。

但是,Prateek只有X數額的錢花在禮物上,他想邀請他的連續範圍內的朋友,這些朋友的禮物費用總和等於X.

如果他可以邀請他的朋友,誰可以滿足上述條件,那麼打印YES,否則打印NO。

輸入: 第一行包含一個整數T,表示測試用例的數量。在每個測試案例中,下列輸入將會出現: - 下一行包含兩個空格分隔的整數N和X,其中N表示朋友的數量,X表示Prateek可以花在禮物上的金額。 - 接下來的N行包含N個整數,其中第i行包含第i個整數,表示Costi。

輸出 輸出完全T行,每行包含相應測試用例的答案。

限制條件:

1 <= T <= 10 
1 <= N , Costi <= 106 
1 <= X <= 1012 

輸入樣例

1 
    5 12 
    1 
    3 
    4 
    5 
    2 

樣本輸出

YES

說明

在樣品輸入,T等於噸因此,相應地,在下一行中,分別給出N和X的值分別是5和12。在接下來的5行中,你有第i個朋友提問。因爲編號從2到4(包含)的朋友的禮物價值是{3,4,5},他們的總和等於12 - 也就是X的給定值。所以答案是YES。

我的解決辦法是在這裏

b = Array.new 
a = Array.new 
t = gets.to_i 
if t >= 0 && t <= 10 
    t.times do 
     n, x = gets.chomp.split.map(&:to_i) 
     n.times do 
     a << gets.to_i 
     end 
     (1..a.length).each do |num| 
      a.each_cons(num).each do |pair| 
      if pair.inject(:+) == x 
      b << "YES" 
      else 
      b << "NO" 
      end 
      end 
     end 
     if b.include?("YES") 
      puts "YES" 
     else 
      puts "NO" 
     end 
    end 
    end 

儘管他們已經接受我的答案,它不通過所有的測試案例,所以我不satisfied.Can有人幫我正確的,更高效,更優雅的解決方案?

+0

您的鏈接只是顯示一個登錄頁面。 –

+0

@JörgWMittag哦是的..不好意思..我猜你必須登錄才能看到挑戰。我會發布整個問題 –

+0

這不是一個Ruby問題,它是一個分配問題 - 你不應該在這裏問這樣的問題 –

回答

0

我建議你你的答案分裂成幾個部分:

  1. 從用戶
  2. 確定一個數組是否包含連續的子陣列求和給定的數字
  3. 印刷YESNO讀取輸入。

您的代碼很難閱讀,因爲所有這些責任都是交織在一起的。第2點是至關重要的。爲了與第1和第3點一起玩,它可以用一個函數來解決,該函數接受一組數字和所需的總和作爲參數,並且如果存在具有期望的總和的連續子陣列並且返回true,否則返回true

最簡單的算法查看所有的子數組,計算它們的總和並與期望的總和進行比較。

def consecutive_sum?(array, sum) 
    (0...array.size).each do |start| 
    (start...array.size).each do |stop| 
     return true if array[start..stop].inject(&:+) == sum 
    end 
    end 

    false 
end 

startstop標記子數組的開頭和結尾。 Array#inject用於計算子陣列的總和。

我會給你留下第1點和第3點。

2

看一看each_cons

array = [1,2,3,4,5] 

number = 5 
array.each_cons(2) { |pair| puts 'YES' if pair.inject(:+) == number } 
#=> 'YES' 

number = 10 
array.each_cons(2) { |pair| puts 'YES' if pair.inject(:+) == number } 
#=> nil 

或者當你想返回 'YES' 或 'NO':

array.each_cons(2).any? { |pair| pair.inject(:+) == number } ? 'YES' : 'NO' 
相關問題