2016-12-05 99 views
0

我有這樣的代碼:如何解決類型錯誤無不能強迫Fixnum對象

require 'set' 

N, K = gets.split().map{ |v| v.to_i } 
set = Set.new 
numbers = gets.split().map{ |v| v.to_i } 
pairs = 0 

N.times do |i| 
    set.add(numbers[i]) 
end 

set.each{ |value| pairs += set.include?(value+K) ? 1 : 0 } 

puts pairs 

但是當我把N和K,返回此錯誤:

`+': nil can't be coerced into Fixnum (TypeError) 

我應該轉換或其他事情?謝謝!

+0

所以,我做什麼?對我來說沒有意義 –

+0

我認爲這裏的問題是'數字[i]'在某些情況下是零,所以'set'被'nil'推到它。然後當你迭代集合時,'value'在某些情況下是零,所以'value + K'失敗。你可以用'.compact'從數組中刪除nil元素,但我不確定這是否解決了你的問題,因爲我沒有完全理解這個代碼的目標是什麼。 –

+0

緊湊沒有工作 –

回答

1

你想計算你的集合中由K分隔的對的數量嗎? 當您輸入3 1後跟1 2 3時,您的代碼將起作用。它回答了2

  • 首先,你真的應該多描述一下你的目標是什麼。
  • 然後,不需要輸入N.它應該是你的設置的大小。
  • 寫調用gets

這裏是一個可能實現之前所需的輸入的例子:

require 'set' 

puts 'Please type the integers of your set, separated by a space. Example : 1 2 3' 
numbers = Set.new(gets.split.map{ |v| v.to_i}) 

# N=numbers.size # But you don't need it 

puts 'Which pair difference are you looking for? Example : 1' 
k = gets.to_i 

pairs = numbers.select{|value| numbers.include?(value+k)} 

count = pairs.size 

puts "#{count} pair(s) found :" 

pairs.each{|first_value| 
    puts format("(%d, %d)",first_value,first_value+k) 
} 

# Please type the integers of your set, separated by a space. Example : 1 2 3 
# 1 2 3 
# Which pair difference are you looking for? Example : 1 
# 1 
# 2 pair(s) found : 
# (1, 2) 
# (2, 3) 
相關問題