Ruby 红宝石字母排序
我正在讨论一些关于HackerRank的问题,需要按字母顺序将数据排序为子字符串“最短者优先” 比如说Ruby 红宝石字母排序,ruby,sorting,data-structures,alphabet,Ruby,Sorting,Data Structures,Alphabet,我正在讨论一些关于HackerRank的问题,需要按字母顺序将数据排序为子字符串“最短者优先” 比如说 ["cd","cc","cca", "ccb"] 预期输出应为 ["cca","ccb","cc","cd"] 我的输出如下所示 ["cc","cca","ccb",&qu
["cd","cc","cca", "ccb"]
预期输出应为
["cca","ccb","cc","cd"]
我的输出如下所示
["cc","cca","ccb","cd"]
使用以下简单代码
substring.sort! {|s1,s2| s1 <=> s2 }
预期产量为
["aac","aa","a","bb","bd","c","cd","da"]
["ca","cb","cca","ccb","ccc","cc","d"]
例2
["d","ca","cb","cc","cca","ccb","ccc"]
预期产量为
["aac","aa","a","bb","bd","c","cd","da"]
["ca","cb","cca","ccb","ccc","cc","d"]
我希望这更清楚。应该没有必要使用黑客方法,
排序
足够灵活
您的代码当前使用默认Ruby的比较(
)将s1
与s2
进行比较。我认为您应该首先比较s1
和s2
的长度,当长度相等时返回字母顺序比较
另一种方法是按大小对输入数组进行分组,然后对每个块进行独立排序,然后展平数组。大致如下:
input\u array.group\u by(&:size).sort.map(&:last.map(&:sort).map(&:sort.plant
看起来是这样的:
irb(main):025:0> ["defg", "c", "cd", "cc", "cca", "ccb"].group_by(&:size).sort.map(&:last).map(&:sort).flatten
=> ["c", "cc", "cd", "cca", "ccb", "defg"]
附加到字符串不是一种有效的策略,尤其是对于HackerRank任务。尽管如此,最好在问题中写下你的版本,这样我们可以改进你的代码。现在还不清楚你想在这里实现什么。你说“最短优先”,然后在预期结果中,“cc”在“cca”之后?您的输出是100%正确的,即使它与
ari.sort
output相同<代码>排序正在使用
进行比较,速度会快得多,因为不涉及自定义块。“需要按字母顺序将数据排序为子字符串“最短者优先”-这毫无意义。这两种排序是相互矛盾的。似乎他们使用的排序方法是比较第一个字符串和第二个字符串中每个字母的大小,而不是所有字母的总和。如果第一个字母的大小相同,它将检查第二个字母。感谢您的回答,但是对于这个例子,您在这里给出的预期答案将是[“cca”、“ccb”、“cc”、“c”、“cd”、“defg”]它的排序方式似乎是基于每个字母的字节大小。它将第一个字符串中的第一个字母与第二个字母进行比较,如果它们相同,它将比较每个字符串中的第二个字母。根据您的评论,排序似乎是按字母顺序排列的,最后是最短的(“cca”在“c”之前,这与常规排序相反),有两种方法:要么弄清楚如何对元素进行分组,然后在每个组中对它们进行排序,要么编写一个方法对两个给定字符串进行排序并使用该方法(在这种特殊情况下,排序是按第一个字母进行的-如果它们相等,排序结果等于两个字符串其余部分的排序结果;比较空字符串始终意味着它“大于”任何非空字符串)