ruby – 以下数组和目标和代码有什么问题?

两总和

  1. 定义一个方法, two_sum ,接受一个数组和一个目标和(整数)作为参数。
  2. 如果数组中的任何两个整数与目标相加,则该方法应返回true。
  3. 否则,它应该返回false。 假设数组只包含整数。

 def two_sum(array, target) i = 0 sum = [] while i < array.max i = i + 1 b = i + i sum.push(b) end sum.include?(target) end puts "------Two Sum------" puts two_sum([1,2,3,4,5,6], 8) == true #(im getting true) puts two_sum([1,2,3,4,5,6], 18) == false #(im getting true) puts two_sum([1,3,6], 6) == false #(im getting false) puts two_sum([1,8,2,1], 0) == false #(im getting true) 

这是在性能很重要时尝试加速计算,特别是当数组很大并且包含许多重复值时。

 require 'set' def two_sum(arr, target) return true if target.even? && arr.count(target/2) > 1 st = Set.new arr.uniq.each do |n| return true if st.include?(target-n) st << n end false end 

例子

 two_sum [1, 4, -4, 4, 5], 6 #=> true two_sum [1, 3, -4, 3, 4], 6 #=> true two_sum [1, 3, -4, 3, 5], 5 #=> false 

说明

target偶数值的代码有两个目的:

  • 当数组包含的值等于target的一半时,它会使计算短路,并且该值在数组中至少出现两次; 和
  • 如果前面提到的代码没有返回true ,它允许在执行剩余计算之前删除arr的重复值。

对于第一个例子,步骤如下。

 arr = [1, 4, -4, 4, 5] target = 6 target.even? #=> 6.even? => true arr.count(target/2) > 1 #=> arr.count(3) > 1 #=> 1 > 1 #=> false 

如此true不归还。

 st = Set.new => # b = arr.uniq #=> [1, 4, -4, 5] 

b的第一个元素现在传递给块。

 n = 1 st.include?(target-n) #=> st.include?(6-1) => false as the set is empty st << n #=> # 

接下来的步骤如下。

 n = 4 st.include?(target-n) #=> st.include?(6-4) => false st << n #=> # n = -4 st.include?(target-n) #=> st.include?(6-(-4)) => false st << n #=> # n = 5 st.include?(target-n) #=> st.include?(6-5) => true 

如此true的回归。

ruby解决方案看起来像:

 def two_sum(array, target) array.combination(2).any? { |v| v.reduce(:+) == target } end 

Array#combination返回两个元素和Enumerable#any?所有组合Enumerable#any? 如果块计算结果为true ,则返回true否则返回false

循环遍历数组的每个元素,这是一个好的开始。 在这个循环中,你需要尝试将每对元素加在一起。 目前,所有你推动你的和数组是i+i :索引加倍(即每个偶数从0到你的数组的最大元素加倍)。

您可以尝试通过两个循环对一对元素求和,一个在另一个内。 他们都遍历数组的元素。 在内部循环中,您将尝试将外部循环中的当前元素添加到内部循环中的当前元素。 如果你得到任何匹配,你可以返回true并立即退出; 否则返回false。