ruby – 以下数组和目标和代码有什么问题?
两总和
- 定义一个方法,
two_sum
,接受一个数组和一个目标和(整数)作为参数。 - 如果数组中的任何两个整数与目标相加,则该方法应返回true。
- 否则,它应该返回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。