arrays - 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'
解决方案
为了使用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"
推荐阅读
- python - Python:for-in 循环不检查列表中的最后一个字符串,为什么?
- git - 为什么补丁可以在任何时候重新创建任何文件?
- ruby-on-rails - 如何在 Chrome 窗口上的选项卡之间切换、聚焦并在这两个选项卡上工作,或者在 Chrome 的窗口浏览器之间切换?
- java - 查找从 1 到 20 的 lcm,给出错误“在 Main.gcd(Main.java:21)”
- c# - 当且仅当满足某些先决条件时,是否可以启动转换器?
- batch-file - 为什么批处理文件中的日期时间格式会给出不同的结果?
- python - 虽然裸 python 烧瓶成功启动,但我的 uwsgi 启动失败,出现奇怪的 python 库导入错误
- django - 使用日期动态搜索
- java - 将多个过滤器应用于Java中的地图
- python - 'NoneType' 对象不可使用 json 文件进行迭代