反转字符串中的字符,而不考虑空格数-Ruby

时间:2018-09-30 12:56:14

标签: ruby string dictionary join split

这个问题来自codewars

完成接受字符串参数并反转字符串中每个单词的函数。字符串中的所有空格都应保留。

这是我的代码,仅适用于带有单个空格的字符串,但是我似乎无法弄清楚如何添加/减去任何内容以使其适用于每个字符串之间有一个以上空格的字符串字。

def reverse_words(str)

str.split(" ").map(&:reverse!).join(" ")

end

示例:

('The quick brown fox jumps over the lazy dog.'), 'ehT kciuq nworb xof spmuj revo eht yzal .god')

('apple'), 'elppa')

('a b c d'), 'a b c d')

('double  spaced  words'), 'elbuod  decaps  sdrow')

4 个答案:

答案 0 :(得分:1)

我认为解决此问题的最简单方法是使用正则表达式。

def reverse_words(str)
  str
    .scan(/(\s*)(\S+)(\s*)/)
    .map { |spacer1, word, spacer2| spacer1 + word.reverse + spacer2 }
    .join
end

这将在字符串中搜索第一组捕获的零个或多个空格。后跟一个或多个非空白,由第二组捕获。随后是在第三组中捕获的零个或多个空格。映射到结果数组上,我们可以将间隔符与反向单词组合在一起,然后将整个事物结合在一起。

以上结果将显示以下输出:

  • reverse_words('The quick brown fox jumps over the lazy dog.')
    #=> "ehT kciuq nworb xof spmuj revo eht yzal .god"
    
  • reverse_words('apple')
    #=> "elppa"
    
  • reverse_words('a b c d')
    #=> "a b c d"
    
  • reverse_words('double  spaced  words')
    #=> "elbuod  decaps  sdrow"
    
  • reverse_words(' foo    bar   ')
    #=> " oof    rab   "
    

参考:

答案 1 :(得分:0)

您在这里:

irb(main):023:0> 'double  spaced  words'.split(//).reverse.join
=> "sdrow  decaps  elbuod"

通过正则表达式,因此String#split不会省略空格。文档中也有类似的例子

答案 2 :(得分:0)

就算递归,即使Johan Wentholt的答案是迄今为止最好的:

def part(string)
  if string.count(" ") > 0
    ary = string.partition(/\s{1,}/)
    last = ary.pop
    ary << part(last)
    ary.flatten
  else string
  end
end

part(string).map(&:reverse).join

答案 3 :(得分:0)

好吧

 f = " Hello im the     world"
 ff = f.split #=> ["Hello", "im", "the", "world"]
 ff.each do |a|
       a.reverse! #=> ["olleH", "mi", "eht", "dlrow"]
 end

ff.join! #=> "olleH mi eht dlrow"