高&来自字符串的低数字(Ruby)

时间:2016-05-25 02:16:50

标签: ruby

晚上好,

我试图在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

2 个答案:

答案 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]