这个问题来自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')
答案 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"