不知道我在做什么错,但我似乎误会了。
问题是,您将得到一串用空格分隔的数字,并且必须返回最高和最低数字。
注意: 所有数字都是有效的Int32,无需验证它们。 输入字符串中始终至少有一个数字。 输出字符串必须是两个数字,并用一个空格隔开,最高的数字是第一个。
def high_and_low(numbers)
# numbers contains a string of space seperated numbers
#return the highest and lowest number
numbers.minmax { |a, b| a.length <=> b.length }
end
输出:
`high_and_low': undefined method `minmax' for "4 5 29 54 4 0 -214 542 -64 1 -3 6 -6":String
答案 0 :(得分:12)
minmax
未为字符串实现。您需要先将字符串拆分为一个数组。但是请注意,split
将返回一个字符串数组,而不是数字,您将需要在下一步中将字符串转换为整数(to_i
)。
由于minmax
以与所需顺序相反的顺序返回值,因此您需要使用reverse
旋转数组,然后仅将join
这些数字带有空格以得到最终结果。
numbers = "4 5 29 54 4 0 -214 542 -64 1 -3 6 -6"
def high_and_low(numbers)
numbers.split.minmax_by(&:to_i).reverse.join(' ')
end
high_and_low(numbers)
#=> "542 -214"
答案 1 :(得分:3)
怎么样:
numbers_array = numbers.split(' ')
"#{numbers_array.max} #{numbers_array.min}"
如果您以一串数字开头,则可能需要在调用拆分之后强制转换.to_i
。
在这种情况下:
numbers_array = numbers.split(' ').map { |n| n.to_i }
"#{numbers_array.max} #{numbers_array.min}"
答案 2 :(得分:1)
从字符串开始时,必须将其转换为数组以在其上强制minmax
。
同样,通过在数组上强制.map(&:to_i)
来比较整数。否则,您将比较代码点而不是数值。
def get_maxmin(string)
string.split(' ')
.map(&:to_i)
.minmax
.reverse
.join(' ')
end
答案 3 :(得分:1)
无需将字符串转换为数组。
def high_and_low(str)
str.gsub(/-?\d+/).
reduce([-Float::INFINITY, Float::INFINITY]) do |(mx,mn),s|
n = s.to_i
[[mx,n].max, [mn,n].min]
end
end
high_and_low "4 5 29 54 4 0 -214 542 -64 1 -3 6 -6"
#=> [542, -214]
这使用String#gsub的形式,该形式具有一个参数且没有任何块,因此它返回一个我链接到Enumerable#reduce的枚举数(也称为inject
)。 gsub
因此仅生成正则表达式/-?\d+/
的匹配项,并且不执行任何替换。
答案 4 :(得分:0)
我对这个kata的解决方案
def high_and_low(numbers)
numbers.split.map(&:to_i).minmax.reverse.join(' ')
end
Test.assert_equals(high_and_low("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6"), "542 -214")
#Test Passed: Value == "542 -214"
一些关于方法的文档: String#split Array#map Array#minmax Array#reverse Array#join
的更多信息 numbers.split.map(&:to_i)
与number.split.map { |p| p.to_i }
但是,我敢肯定,“ minmax_by(&:to_i)”看起来更好。