class Triplet
def initialize(array,sum)
@array = array.sort()
@array_size = array.size()
@sum = sum
@result = []
end
def get_triplet
@array[0..-3].each_with_index do |arr, ind|
pointer_one = ind + 1
pointer_two = @array_size - 1
while (pointer_one < pointer_two)
temp_sum = @array[pointer_one] + @array[pointer_two] + arr
if(temp_sum == @sum)
@result.push([@array[pointer_one], @array[pointer_two], arr])
elsif temp_sum < @sum
pointer_one = pointer_one +1
else
pointer_two = pointer_two -1
end
end
end
end
def get_result
@result.each do |res|
puts res
end
end
end
puts "Enter the array of numbers"
array = gets.chomp
array = array.split(' ')
array_integer = array.map{|a| a.to_i}
puts array_integer
puts "Enter the sum"
sum = gets.chomp
puts sum
t1 = Triplet.new(array_integer,sum.to_i)
t1.get_triplet
t1.get_result
任何人都可以建议我修复它,以便它不会无限循环。这是在数组中找到三元组的程序,其总和为@sum。它在get_triplet方法中循环。 Initialize方法设置数组,数组大小。 get_triplet方法应该存储结果数组中总和为@sum的所有三个数字。
答案 0 :(得分:2)
通常这样的代码纠结是一个不对的标志,在这种情况下,问题的根源是不知道combination
方法。这是一个功能相当的解决方案:
def triplet(list, target)
list.combination(3).find do |a,b,c|
a + b + c == target
end
end
例如:
arr = [ 1, 2, 3, 4, 5, 6, 7, 8 ]
p triplet(arr, 6)
# => [1, 2, 3]
p triplet(arr, 4)
# => nil
p triplet(arr, 10)
# => [1, 2, 7]
您的代码中使用的算法看起来有问题,或至少实现不正确,并且也严格限于三元组。此代码更通用,并使用经过验证的经过测试的算法,因此它可能更适合解决您的特定问题。