返回数组中第二高的值 - ruby

returning the second highest value in an array - ruby

我有一个函数接收字符串 a returns 第二大值。

例如,如果输入是“abc123”,则 returning 值为 2。 这工作正常。

但是我想更改函数,以便如果只找到一个或没有找到整数..我想 return -1.

例如,如果输入 = "abc1",return 值应该 = -1 此输入的当前 returning 值为 0。

这是我的函数

def function(input)
  input.split("").map { |x| x.to_i }.sort[-2]
end

任何帮助都会很棒!

您可以先使用#scan 方法来select 整数。如果整数的大小将小于两个 — [-2] returns nil,因此您可以使用 || 来传递您的默认值。

def function(input)
  input.scan(/\d/).map(&:to_i).sort[-2] || -1
end
def second_largest(str)
  (str.gsub(/\d/).max(2)[1] || -1).to_i
end
second_largest("ab42de61f") #=>  4
second_largest("ab63f")     #=>  3
second_largest("a6b25f")    #=>  5
second_largest("ab1def")    #=> -1
second_largest("abcdef")    #=> -1

如果

str = "ab42de61f"

然后

enum = str.gsub(/\d/)
  #=> #<Enumerator: "ab42de61f":gsub(/\d/)>

as String#gsub returns 是一个枚举器,当它被调用时只有一个参数且没有块。在这种形式下,它不再与字符替换有任何关系。它只是枚举其参数的匹配项。

我们可以通过将此枚举器转换为数组来查看将生成的元素:

enum.to_a
  #=> ["4", "2", "6", "1"]

继续,

arr = enum.max(2)
  #=> ["6", "4"]

当字符串包含很多数字并且只需要两个最大的数字时,使用 Enumerable#max 显然比对所有数字排序更有效(O(n) vs O(nlog(n)),其中n是位数。

接下来,

s = arr[1] || -1
  #=> "4" || -1 => "4"

最后

s.to_i
  #=> 4

同样,

"ab1def".gsub(/\d/).max(2) #=> ["1"]
"abcdef".gsub(/\d/).max(2) #=> []

解释了最后两个示例的 return 值 (-1)1.

1.请注意 -1.to_i #=> -1.