Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化这个ruby代码_Ruby_Algorithm_Optimization - Fatal编程技术网

优化这个ruby代码

优化这个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

因此,这段代码将计算差为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

未经测试,希望是实际的Ruby代码

Set的文档:


我不认识Ruby,所以我给你一个大主意:

  • 获取列表
  • 保留一个布尔数组(称之为
    arr
    ),如果列表中存在数字,则将数字标记为true
  • 循环浏览列表,查看
    arr[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)