按组大小拆分和分组字符串

时间:2014-08-20 21:05:16

标签: ruby

给定一个不同长度的字符串,它将包含所有相同的字母

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那样不必要地创建哈希。

2 个答案:

答案 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获取数组

享受:)