Ruby 字母排序

问题描述

我正在研究一些关于 HackerRank 的问题,需要按字母顺序对数据进行子字符串排序“最短的在前” 例如

["cd","cc","cca","ccb"]

预期的输出应该是

["cca","ccb","cd"]

我的输出如下

["cc","cd"]

使用以下简单代码

substring.sort! {|s1,s2|   s1 <=> s2  }

我的问题是如何进行排序以匹配预期的输出。 我在想是否可以使字符串具有相同的大小并在字符串的末尾附加一个大值,然后我可以匹配预期的输出,但之后我必须清理字符串。

我不确定在 ruby​​ 中是否有可能在没有 hacky 方法的情况下解决它。

请给我你的建议。

编辑 抱歉,如果不清楚。基本上,他们使用的算法是检查第一个字符串的第一个字母并将其与第二个字符串进行比较。如果它们相同,它将移动到每个字符串的下一个字母......等等......诀窍是如果它们的大小不同,它总是将较短的字符串排序为大于较长的字符串,如果最后一个字母为小字符串与第二个字符串相同。我需要举更多的例子来澄清。

示例 1

["aac","aa","c","cd","da","a","bb","bd"]

预期输出

["aac","bd","da"]

示例 2

["d","ca","cb","ccc"]

预期输出

["ca","ccc","d"]

我希望这样更清楚。

解决方法

应该不需要hacky方法,sort已经足够灵活了。

您的代码当前使用默认的 Ruby 比较 (s1) 将 s2<=> 进行比较。我相信你应该先比较 s1s2 的长度,当长度相等时返回字母比较。

另一种方法是按大小对输入数组进行分组,然后独立地对每个块进行排序,然后将数组展平。类似的东西:

input_array.group_by(&:size).sort.map(&:last).map(&:sort).flatten

这似乎是这样工作的:

irb(main):025:0> ["defg","c","cd","cc","cca","ccb"].group_by(&:size).sort.map(&:last).map(&:sort).flatten
=> ["c","ccb","defg"]