优化这个ruby代码
因此,这段代码将计算差为K的数对的总数。这是一种简单的方法,我需要对其进行优化。建议优化这个ruby代码,ruby,algorithm,optimization,Ruby,Algorithm,Optimization,因此,这段代码将计算差为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 diff
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
未经测试,希望是实际的Ruby代码 Set的文档:
我不认识Ruby,所以我给你一个大主意:
arr
),如果列表中存在数字,则将数字标记为truearr[num-K]
和/或arr[num+K]
是否为真,其中num
是列表中的一个数字n
到整数count
num+K
和num-K
添加到哈希映射中,相应地递增count
num
。如果是,则按计数增加计数器
有人删除了他的帖子,或者他的帖子被删除了。。。他有最好的解决方案,这里是:
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.如果您能给出一些输入和输出的示例,那就太好了,但我认为这是正确的
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)
N
有用吗?如果我们看不到代码的另一部分,您可以删除我们不需要的部分吗?xdn是数字的数量数字。shift
,它不使循环准确吗?如果你有[1,2,3,4],那么i
不会只取1和3作为值吗?如果数字是[1,2,3,4],那么j得到[2,3,4],你能试着运行这个小脚本吗arr=[1,2,3,4,5,6]
对于arr中的i放置i
arr.shift
结束
这比我的慢,这就是他删除它的原因如果我对丢失的数据的看法正确(在问题的评论中提到),那么你的运行速度至少快了两倍。
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)