编辑:由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应用程序和我的本地机器上运行时没有错误。
3条答案
按热度按时间lc8prwob1#
输出正确,但编译器抛出上述错误,导致测试失败
尽管
puts
生成 * 输出 *,但它的 * 返回值 * 为nil
:我假设您的方法应该 return 该值,而不是将其打印到标准输出。
您可以通过删除方法最后一行中的
puts
来修复此问题:要生成调试输出,您可以在返回值之前的单独一行中添加
puts num
,例如:或者你可以使用
p
,它输出对象的inspect
值并返回对象:关于性能:试着理解代码要做什么才能得到结果。“short”解决方案递增
num
并检查它是否包含在数组中。但包含检查必须遍历数组(至少到匹配的元素)。因此,对于num
的每一次递增,都是从头遍历数组。通过使用
Set
进行查找,可以大大加快查找速度:t3irkdon2#
uhry853o3#
如果要在代码中打印,只需删除Javascript中的Ex行,删除usedconsole.log