ruby - 反转原始数组

标签 ruby

我正在尝试颠倒这个数组,首先让数组的末尾成为前半部分。为什么我的输出会跳过将 9 放入数组 [0] 中?我有 array[0] = tem[9-0-1] 所以 array[0] = temp[8]?这不是真的吗?

def sameArray(array)
  temp = array
  for i in array[0]..(((array.length)/2).floor)
      array[i] = temp[array.length - i - 1]
      ##puts array[i]
  end
end

sameArray([1,2,3,4,5,6,7,8,9])

# array[0] => array[8]
#array[1] => array[7]
#array[2] => array[6]
#array[3] => array[5]

最佳答案

你的程序有几个问题:

  1. 你并没有真正交换索引 i 的值和 array.length - i - 1 ,因此,数组没有完全反转
  2. 您的方法不返回更新后的数组,而是返回 for 的结果循环这是范围 [1..4] .
  3. 你的 for循环错误地使用了 array[0]作为范围内的第一个值,而它应该只是 0 .
  4. temp不是 array 的真正副本, 它只是对 array 的另一个引用,因此,最终将修改 array如果使用 temp 完成任何更改.

基于以上观察,这里有一个更新的方法:

def sameArray(array)
  temp = array.dup
  for i in 0..(((temp.length)/2).floor)
       temp[i], temp[-i-1] = temp[-i-1], temp[i]
  end
  return temp
end

请注意 temp.length - i - 1可以写成 -i-1 , 与 -1 相同索引表示数组的最后一个元素。


通过使用一些惯用的 Ruby,我们可以摆脱临时变量 temp并使用 each代替 for环形。这是一个可以被认为更符合 Ruby 习惯的代码版本。

def reverse(array)
  array.dup.tap do |a|
    (0..a.length/2).each do |i|
      a[i], a[-i-1] = a[-i-1], a[i]
    end
  end
end

关于ruby - 反转原始数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38055557/

相关文章:

ruby-on-rails - 如何在 Controller 中跨多个操作存储实例变量?

javascript - 尝试从排列的 JSON 键中删除引号

ruby-on-rails - 正在进行 Rspec/Capybara 加载,循环要求被认为是有害的

ruby - Rails 开发服务器、PDFKit 和多线程

ruby - 如何在不同文件中使用 Rspec shared_examples?

Ruby block - 除非和如果比较

ruby - 如何阻止 Savon 向 soap.body 添加前缀

arrays - 如何检查数组中的每个元素是否都大于它之前的元素?

ruby:在引发中断之前完成循环迭代

ruby-on-rails - 删除数据库表中的所有记录