替换数组中的每个奇数元素

时间:2015-08-12 16:15:13

标签: arrays ruby

我有:

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}"

我正在寻找更有效的替代此代码。

2 个答案:

答案 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 }

这与您的代码具有相同的效果,但它应该适用于任何大小的数组(假设它们的长度相同)。