我有2个字符串:
a = "qwer"
b = "asd"
Result = "qawsedr"
同样是b的长度大于a。显示替代角色。
最好的方法是什么?我应该使用循环吗?
答案 0 :(得分:2)
您可以从a
和b
字符串中获取字符,以便将它们作为数组使用,然后"合并"他们使用zip
,然后使用join
。
对于长度不同的字符串,必须反转数组值,所以:
def merge_alternately(a, b)
a = a.chars
b = b.chars
if a.length >= b.length
a.zip(b)
else
array = b.zip(a)
array.map{|e| e != array[-1] ? e.reverse : e}
end
end
p merge_alternately('abc', 'def').join
# => "adbecf"
p merge_alternately('ab', 'zsd').join
# => "azbsd"
p merge_alternately('qwer', 'asd').join
# => "qawsedr"
答案 1 :(得分:0)
塞巴斯蒂安的回答完成了工作,但这是不必要的复杂。这是另一种选择:
def merge_alternately(a, b)
len = [a.size, b.size].max
Array.new(len) {|n| [ a[n], b[n] ] }.join
end
merge_alternately("ab", "zsd")
# => "azbsd"
第一行获取较长字符串的大小。第二行使用Array构造函数的块形式;它产生从0到len-1
的索引到块,产生类似[["a", "z"], ["b", "s"], [nil, "d"]]
的数组。 join
将其转换为字符串,方便地在每个项目上调用to_s
,将nil
变为""
。
这是另一个基本相同的版本,但跳过中间数组:
def merge_alternately(a, b)
len = [a.size, b.size].max
len.times.reduce("") {|s, i| s + a[i].to_s + b[i].to_s }
end
len.times
会产生一个枚举器,用于生成从0
到len-1
的索引。 reduce
以空字符串s
开头,并在每次迭代中附加a
和b
(或""
- nil.to_s
的下一个字符 - 如果一个字符串用完字符)。
您可以在repl.it上查看:https://repl.it/I6c8/1
只是为了好玩,这里有几个解决方案。这个很像Sebastián的解决方案,但是如果它比第二个短,则填充第一个字符数组{/ 1}}:
nil
如果没有一点def merge_alternately(a, b)
a, b = a.chars, b.chars
a[b.size - 1] = nil if a.size < b.size
a.zip(b).join
end
,它就不是Ruby的答案:
gsub
请参阅repl.it上的这两项:https://repl.it/I6c8/2