【发布时间】:2014-04-08 16:37:00
【问题描述】:
我想用 Ruby 每两个字符反转一个字符串。
输入:
"0123456789abcdef"
我期望的输出:
"efcdab8967452301"
【问题讨论】:
我想用 Ruby 每两个字符反转一个字符串。
输入:
"0123456789abcdef"
我期望的输出:
"efcdab8967452301"
【问题讨论】:
我不确定这是否是最好的方法:
"0123456789abcdef".scan(/../).reverse.join == "efcdab8967452301"
【讨论】:
('') :-)
"0123456789abcdef".gsub(/../, &:reverse).reverse
# => "efcdab8967452301"
【讨论】:
你可以试试:
"0123456789abcdef".chars.each_slice(2).to_a.reverse.join
【讨论】:
我喜欢所有的解决方案,尤其是@sawa 的解决方案,但现在,六个小时后,想出一些不同的东西是一个挑战。为了多样性,我提供了一种使用成对替换的方法。这是破坏性的,所以我先复制字符串。
代码
str = "0123456789abcdef"
s = str.dup
(0...s.size/2).step(2) { |i| s[i,2], s[-i-2,2] = s[-i-2,2], s[i,2] }
s #=> "efcdab8967452301"
说明
让
enum = (0...s.size/2).step(2) #=> #<Enumerator: 0...8:step(2)>
我们可以看到枚举的内容:
enum.to_a #=> [0, 2, 4, 6]
字符串
s #=> "0123456789abcdef"
每次调用block后如下:
i = 0: "ef23456789abcd01"
i = 2: "efcd456789ab2301"
i = 4: "efcdab6789452301"
i = 6: "efcdab8967452301"
【讨论】:
"0123456789abcdef".split('').each_slice(2).to_a.reverse.flatten.join('')
=> "efcdab8967452301"
【讨论】: