因此,此代码将计算差异为K的数字对的总数。这是天真的方法,我需要优化它。建议?
test = $stdin.readlines
input = test[0].split(" ")
numbers = test[1].split(" ")
N = input[0]
K = input[1]
count = 0
for i in numbers
current = i.to_i
numbers.shift
for j in numbers
difference = (j.to_i - current).abs
if (difference == K)
count += 1
end
end
end
puts count
答案 0 :(得分:4)
您可以提供一些输入和输出示例,但我认为这是正确的。
require 'set'
def count_diff(numbers, difference)
set = Set.new numbers
set.inject 0 do |count, num|
set.include?(num+difference) ? count+1 : count
end
end
difference = gets.split[1].to_i
numbers = gets.split.map { |num| num.to_i }
puts count_diff(numbers, difference)
答案 1 :(得分:3)
未经测试,希望是实际的Ruby代码
Set的文档:http://www.ruby-doc.org/stdlib/libdoc/set/rdoc/classes/Set.html
require 'set'
numbers_set = Set.new
npairs = 0
numbers.each do |number|
if numbers_set.include?(number + K)
npairs += 1
end
if numbers_set.include?(number - K)
npairs += 1
end
numbers_set.add(number)
end
答案 2 :(得分:1)
有人删除了他的帖子,或者他的帖子被删除了...他有最好的解决方案,现在是:
test = $stdin.readlines
input = test[0].split(" ")
numbers = test[1].split(" ")
K = input[1]
count = 0
numbers.combination(2){|couple| couple.inject(:-).abs == K ? count++}
puts count
你甚至不需要N.
答案 3 :(得分:0)
我不认识Ruby所以我只会给你一个大创意:
arr
),如果列表中存在该数字,则将数字标记为true arr[num-K]
和/或arr[num+K]
是否为真,其中num
是列表中的数字这会占用相当多的内存,所以另一种方法是执行以下操作:
n
的哈希映射保留为整数count
num+K
和num-K
添加到哈希地图中,相应地增加count
num
。如果是,请将您的计数器增加count