优化这个红宝石代码

时间:2011-08-08 18:33:08

标签: 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
       difference = (j.to_i - current).abs
       if (difference == K)
           count += 1
       end
   end
end

puts count

4 个答案:

答案 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所以我只会给你一个大创意:

  1. 获取列表
  2. 保留一个布尔数组(称之为arr),如果列表中存在该数字,则将数字标记为true
  3. 在列表中循环,查看arr[num-K]和/或arr[num+K]是否为真,其中num是列表中的数字
  4. 这会占用相当多的内存,所以另一种方法是执行以下操作:

    1. 将整数n的哈希映射保留为整数count
    2. 浏览您的列表,将num+Knum-K添加到哈希地图中,相应地增加count
    3. 浏览列表,查看哈希映射中是否有num。如果是,请将您的计数器增加count
相关问题