【问题标题】:How solve TypeError nil can't be coerced into Fixnum如何解决 TypeError nil 不能被强制转换为 Fixnum
【发布时间】:2016-12-05 07:48:11
【问题描述】:

我有这个代码:

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)

我应该转换还是其他什么?谢谢!

【问题讨论】:

  • 那么,我该怎么办?对我来说没有意义
  • 我认为这里的问题是numbers[i] 在某些情况下为零,所以set 得到nil 推送给它。然后,当您迭代集合时,value 在某些情况下为零,因此value+K 失败。您可以使用 .compact 从数组中删除 nil 元素,但我不确定这是否能解决您的问题,因为我不完全理解这段代码的目标是什么。
  • 契约不起作用

标签: ruby typeerror


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多