2011-08-08 134 views
2

所以這段代碼將計算其差值爲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

'N'有用嗎?如果有另一部分代碼我們看不到,你能否刪除我們不需要的部分? XD – JMichelB

+0

對不起N是數字個數 – Evan

+0

'number.shift',是不是讓循環保持不變?如果你有[1,2,3,4],不會'I'只取1和3作爲值嗎? – JMichelB

回答

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) 
0

我不知道紅寶石所以我只是給你的大創意:

  1. 獲取列表
  2. 保留布爾值如果在列表中的列表中存在
  3. 迴路數陣列(稱之爲arr),標誌着關閉數爲真,看看是否arr[num-K]和/或arr[num+K]都是如此,num是在你的列表中的號碼

它使用了相當多的內存,但這樣的另一種方法是做到以下幾點:

  1. 保持一個哈希表從一個整數n整數count
  2. 通過你的L到達ist,將num+Knum-K添加到哈希映射中,相應地增加count
  3. 查看您的列表並查看num是否在哈希映射中。如果是,通過count
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.

+0

這是比較慢,那麼我的原因是爲什麼他刪除它 – Evan

+1

如果我對丟失的數據是正確的(在問題的評論中提到),那麼你至少運行兩次太快。 – JMichelB