0

n渡された配列内の任意の 2 つの数値の合計として存在するかどうかを調べようとしています。そうであれば、 trueelsefalseを返します。私のコードの問題は、inject希望どおりに反復していないことです。私は何を間違っていますか?

def sum_to_n?(array,n)
  array.each do |i|
    array.inject(i) do |memo,var|
      if memo + var == n
        return true
      else
        return false
      end
    end
  end
end

puts sum_to_n?([1,2,3,4,5],9)
4

5 に答える 5

2

ここにアプローチがあります:

def sum_to_n?(a,n)
  !!a.find{|e| a.include?(n-e)}
end
a = [1,2,3,4,5]
sum_to_n?(a,9) # => true
sum_to_n?(a,11) # => false

これらの 2 つの要素を取得する場合:

def sum_to_n?(a,n)
  num=a.find{|e| a.include?(n-e)}
  unless num
    puts "not exist"
  else
    p [n-num,num]
  end
end
a = [1,2,3,4,5]
sum_to_n?(a,9)
# >> [5, 4]
sum_to_n?(a,11)
# >> not exist

論理

Enumerable#findメソッドは反復ごとに 1 つの配列要素を渡します。ここで、任意の反復について、要素eがあり、それを n から差し引いたとします。今(n-e)、ソース配列に存在するものをテストしていました.一致が見つかった#find場合は検索が停止し、すぐに戻りeます.見つからない場合は、次の反復に進みます. #findが反復を完了しても が見つからなかった場合(n-e)、ドキュメントに従って が返されnilます。

于 2013-10-20T17:07:17.690 に答える
2

この質問はすでに回答されていますが、このアプローチの方が読みやすいと思います。

def sum_to_n?(a,n)
  a.combination(2).find{|x,y| x+y==n}
end

a = [1,2,3,4,5]
p sum_to_n?(a,9)  # => [4, 5]
p sum_to_n?(a,11) # => nil
于 2013-10-21T11:19:33.367 に答える
1

簡単な方法で物事を行う人ではありません。

n = 14
a = [1,3,5,9,13,3,18]
if n==0
  a.select {|x| x == 0}.size > 1
else
  a.map {|x| 2*x - n}.uniq.group_by(&:abs).values.map(&:size).max > 1 # => true
end
  • n != 0 の場合、値を倍増し、n => [-12, -8, -4, 4, 12, -8, 22] を減算します。現在、合計がゼロになるペアを探しています。
  • uniq => [-12, -8, -4, 4, 12, 22]a重複 (2 つの 3) がある場合。uniq がないと、次のステップで問題が発生します。
  • 絶対値でグループ化 => {12=>[-12, 12], 8=>[-8], 4=>[-4, 4], 22=>[22]}. サイズ 2 のハッシュ値は、合計が n (1+13 => [-12,-12] および 5+9 => [-4, 4]) になるペアに対応します。
  • ハッシュ値を選択し、.size => [2, 1, 2, 1] にマップし、[2, 1, 2, 1].max > 1 かどうかを確認します。
于 2013-10-21T07:55:27.097 に答える
0
arr = [1, 2,3,4,5,6,7]

num = 7  (given number for 2 element combination)

以下のプログラムは、単一の組み合わせを返すだけです

arr.uniq.combination(2).detect {|a, b| a + b == num}

=> [2, 5]

以下のプログラムは、可能なすべての組み合わせを返します

arr.uniq.combination(2).find_all {|a, b| a +b == num}

=> [[2, 5], [3, 4]]
于 2016-05-28T07:07:11.797 に答える