不确定我做错了什么,但我似乎大错特错。
问题是,给你一个由空格分隔的数字串,并且必须返回最高和最低的数字。
注:所有数字都是有效的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
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"
怎么样:
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}"
当您从字符串开始时,必须将其转换为数组才能对其强制执行minmax
。此外,请确保通过在数组上投射.map(&:to_i)
来比较整数;否则,您将比较代码点而不是数值。
def get_maxmin(string)
string.split(' ')
.map(&:to_i)
.minmax
.reverse
.join(' ')
end
不需要将字符串转换为数组。
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
(。因此CCD_ 11仅生成正则表达式CCD_。
我的这个卡塔的解决方案
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"
一些关于方法的文档:字符串#拆分数组#映射数组#最小最大数组#反向数组#加入
关于Symbol#to_proc 的更多信息
numbers.split.map(&:to_i)
与number.split.map { |p| p.to_i }
相同
但是"minmax_by(&:to_i("我想看起来肯定更好。