晚上好,
我试图在Codewars上解决问题:
在这个小小的作业中,你会得到一串空格分隔的数字,并且必须返回最高和最低的数字。
示例:的
high_and_low("1 2 3 4 5") # return "5 1"
high_and_low("1 2 -3 4 5") # return "5 -3"
high_and_low("1 9 3 4 -5") # return "9 -5"
注意:
所有数字都是有效的Int32,无需验证它们。 输入字符串中始终至少有一个数字。 输出字符串必须是由一个空格分隔的两个数字,最高的数字是第一个。
我提出了以下解决方案但是我无法弄清楚为什么该方法只返回" 542"而不是" -214 542"。我也尝试使用#at,#shift和#pop,结果相同。
我有什么遗失的吗?我希望有人能指出我正确的方向。我想了解为什么会这样。
def high_and_low(numbers)
numberArray = numbers.split(/\s/).map(&:to_i).sort
numberArray[-1]
numberArray[0]
end
high_and_low("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6")
修改的
我也尝试了这个并且接受了一次失败的测试" Nil":
def high_and_low(numbers)
numberArray = numbers.split(/\s/).map(&:to_i).sort
puts "#{numberArray[-1]}" + " " + "#{numberArray[0]}"
end
答案 0 :(得分:2)
对大型数组使用sort会效率低下。相反,请使用Enumerable#minmax
:
numbers.split.map(&:to_i).minmax
# => [-214, 542]
如果您希望结果保留字符串,请使用Enumerable#minmax_by
:
numbers.split.minmax_by(&:to_i)
# => ["-214", "542"]
答案 1 :(得分:2)
省略return
语句时,函数只返回其体内最后一个表达式的结果。要将两者作为数组写入返回:
def high_and_low(numbers)
numberArray = numbers.split(/\s/).map(&:to_i).sort
return numberArray[0], numberArray[-1]
end
puts high_and_low("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6")
# => [-214, 542]