给定一个不同长度的字符串,它将包含所有相同的字母
str0 = 'AAAAAAA'
或最多两个不同频率的不同字母
str1 = 'AABBBBAAABBB'
我们如何将此字符串拆分并分组为一个数组,其中第一个元素是频率较高的字母的计数,第二个元素是较小频率的计数,即str1
arr = [7, 5]
B
出现7次,A
出现5次。对于长度均匀且频率相等的字符串,数组中的顺序无关紧要。
到目前为止,我有
str = 'AABBBBAAABBB'
arr = str.split("").group_by {|x| x}.values
arr.each_with_object([]){|x, tmp_arr| tmp_arr << x.size}.sort.reverse
[7, 5]
似乎必须有更好更清洁的方法来做到这一点,特别是不必像group_by
那样不必要地创建哈希。
答案 0 :(得分:1)
你非常接近。在这种情况下,each_with_object
可以替换为map
,因为这正是map
的用途,split("")
可以替换为chars
:
str = 'AABBBBAAABBB'
arr = str.chars.group_by {|x| x}.values.map(&:length).sort.reverse
特别是没有不必要地创建哈希,就像group_by那样
我不会真的称之为&#34;不必要&#34;。事实上,我怀疑在这里使用散列比大多数替代方案更有效。
如果效率是一个大问题,那么您可以采取许多措施来优化相关代码。我怀疑任何这样的&#34;优化&#34;解决方案可以像上面那样可读。
答案 1 :(得分:1)
arr.uniq.map{|l| arr.count(l)}.sort.reverse
使用str.chars
获取数组
享受:)