首页 > 解决方案 > RUBY - 如果长度相等,arr.max_by(&:length) 可以返回最后一个实例吗?

问题描述

我已经解决了这个问题,但想通过使用 arr.max_by(&:length) 来清理它,这可能吗?

def longest_streak(str)
    length = 0
    longest = ''
    hash = Hash.new('')
    str.each_char.with_index do |char, index|
        hash[char] += char
    end
    #hash.values.max_by(&:length)
    
    hash.values.each do |string| 
        if string.length >= length
            length = string.length 
            longest = string
        end
    end
    longest
end

p longest_streak('a')           # => 'a'
p longest_streak('accccbbb')    # => 'cccc'
p longest_streak('aaaxyyyyyzz') # => 'yyyyy
p longest_streak('aaabbb')      # => 'bbb'
p longest_streak('abc')         # => 'c'

标签: arraysrubysorting

解决方案


为了使用max_by(&:length),您需要收集条纹。

这可以通过each_char和生成chunk_while

str = "accccbbb"

str.each_char          #=> ["a", "c", "c", "c", "c", "b", "b", "b"]
   .chunk_while(&:==)  #=> [["a"], ["c", "c", "c", "c"], ["b", "b", "b"]]
   .max_by(&:length)   #=> ["c", "c", "c", "c"]
   .join               #=> "cccc"

请注意,上面返回的是最长的连续字母。

如果有多个匹配项并且您想要最后一个匹配项,则可以简单地reverse使用字符串:

str = "aabbcc"

str.each_char.chunk_while(&:==).max_by(&:length).join
#=> "aa"

str.reverse.each_char.chunk_while(&:==).max_by(&:length).join
#=> "cc"

推荐阅读