ruby 代码错误:结果类型无效,应为Integer,但找到NilClass

uujelgoq  于 2023-01-30  发布在  Ruby
关注(0)|答案(3)|浏览(99)

编辑:由Stefan解决,但是:现在,剩下的问题只有:为什么较短的解决方案性能如此差(结果:100%,性能:32%,结果:66%),而较长的版本表现稍好但似乎产生更差的结果(60%,50%,55%)?
原始问题开始:我目前正在尝试Codility演示测试,要解决的问题是找到不包含在给定数组中的大于0的最小整数。这是我的两个不同版本的代码,结果相同。输出正确,但编译器抛出上述错误,导致测试失败。这似乎是Codility上的常见错误,当在SO上查找此错误时。

# you can write to stdout for debugging purposes, e.g.
# puts "this is a debug message"

def solution(a)
  # write your code in Ruby 2.2
  num = 1
  a=a.sort
  a.uniq!
  a.each do |x|
    if x == num then
      num += 1
      next
    else
      break
    end
  end
  puts num
end

def solution(a)
  # write your code in Ruby 2.2
  num = 1
  while a.include?(num) do
    num += 1
  end
  puts num
end

结果:

Compilation successful.

Example test:   [1, 3, 6, 4, 1, 2]
Output (stderr):
Invalid result type, Integer expected, NilClass found
Output:
5
RUNTIME ERROR (tested program terminated with exit code 1)

Example test:   [1, 2, 3]
Output (stderr):
Invalid result type, Integer expected, NilClass found
Output:
4
RUNTIME ERROR (tested program terminated with exit code 1)

Example test:   [-1, -3]
Output (stderr):
Invalid result type, Integer expected, NilClass found
Output:
1
RUNTIME ERROR (tested program terminated with exit code 1)

Producing output might cause your solution to fail performance tests.
You should remove code that produces output before you submit your solution.

Detected some errors.

我真的不明白怎么回事,数组里只有整数,num是整数,所有的都是整数,但是编译器说是NIL,我该怎么办?
编辑:相同的代码在SoloLearn应用程序和我的本地机器上运行时没有错误。

lc8prwob

lc8prwob1#

输出正确,但编译器抛出上述错误,导致测试失败
尽管puts生成 * 输出 *,但它的 * 返回值 * 为nil

puts 123
# 123      # <- output
#=> nil    # <- return value

我假设您的方法应该 return 该值,而不是将其打印到标准输出。
您可以通过删除方法最后一行中的puts来修复此问题:

def solution(a)
  num = 1
  while a.include?(num)
    num += 1
  end
  num # <- without "puts"
end

要生成调试输出,您可以在返回值之前的单独一行中添加puts num,例如:

def solution(a)
  # ...

  puts num  # <- prints num
  num       # <- returns num
end

或者你可以使用p,它输出对象的inspect值并返回对象:

def solution(a)
  # ...

  p num  # <- prints num.inspect and returns num
end

关于性能:试着理解代码要做什么才能得到结果。“short”解决方案递增num并检查它是否包含在数组中。但包含检查必须遍历数组(至少到匹配的元素)。因此,对于num的每一次递增,都是从头遍历数组。
通过使用Set进行查找,可以大大加快查找速度:

require 'set'

def solution(a)
  set = Set.new(a)
  num = 1
  num += 1 while set.include?(num)
  num
end
t3irkdon

t3irkdon2#

def solution(a)
 range = (1..a.max).to_a
 (range - a).first
end
uhry853o

uhry853o3#

如果要在代码中打印,只需删除Javascript中的Ex行,删除usedconsole.log

相关问题