我有:
arr = [1, 2, 3, 4, 5]
下面的代码将arr
的奇数元素替换为与它们对应的符号:
0 = '+'
1 = '-'
2 = '*'
3 = '/'
4 = '^'
所以12345
会变成1*3^5
。
代码:
sym = ['+', '-', '*', '/', '^']
elements = 1
while elements < 5
arr[elements] = sym[arr[elements]]
elements += 2
end
puts "#{arr.join}"
我正在寻找更有效的替代此代码。
答案 0 :(得分:4)
你可以按如下方式调整你的方法:
(1...arr.size).step(2).each { |i| arr[i] = sym[arr[i]] }
arr.join
#=> "1*3^5"
这是另一种方式:
arr.each_slice(2).flat_map { |x,y| y ? [x, sym[y]] : [x] }.join
#=> "1*3^5"
另一个:
enum = [true, false].cycle
arr.map { |e| enum.next ? e : sym[e] }.join
#=> "1*3^5"
您的方法变异(修改)arr
。你想这样做吗?最后两种方法没有(但可以很容易地修改它们)。
这三种方法中哪一种最好?你告诉我!
答案 1 :(得分:1)
我认为您不会找到更快的解决方案,但您可能会发现更优雅的解决方案。这就是我接近这个的方法:
arr = [1, 2, 3, 4, 5]
sym = ['+', '-', '*', '/', '^']
arr.map!.with_index { |value, idx| idx.odd? ? sym[idx] : value }
这与您的代码具有相同的效果,但它应该适用于任何大小的数组(假设它们的长度相同)。