返回数组中中值整数的 Ruby 方法



我想写一个方法来查找给定整数数组的中位数。有人可以解释我的代码中出了什么问题/发生了什么。如果数组具有奇数个整数,则返回排序数组中的中间项。如果数组具有偶数个整数,则返回排序数组中中间两项的平均值。下面是我的代码,它一直陷入无限循环。

def median_finder(array)
  array.sort
  element_count = array.length 
  if element_count % 2 != 0
    while element_count != 1 do
      array.shift
      array.pop
    end 
    return array
  else element_count % 2 == 0
    while element_count != 2 do
        array.shift
        array.pop
    end 
    median = ((array[0] + array[1]) / 2)
    return median   
  end
end

你的while循环不会改变变量element_count,所以循环的条件永远不会改变,永远循环。 element_count始终保持原始数组大小的值。快速修复如下:

...
while element_count != 1 do
  array.shift
  array.pop
  element_count = array.length
end
...
while element_count != 2 do
  array.shift
  array.pop
  element_count = array.length
end

你对array.sort的使用是错误的。应该是array.sort!.

而不是:

if element_count % 2 != 0

用:

if element_count.odd?

而不是:

array.shift
array.pop

考虑:

array = array[1..-2]

else不需要条件。这是错误的:

else element_count % 2 == 0

其中之一将起作用:

else

或:

else # element_count % 2 == 0

要非常小心这种逻辑:

element_count != 1

如果array有两个元素并删除它们,会发生什么情况? element_count将为 0,并且仍未满足条件测试,因此代码将继续循环。

而是使用如下测试:

element_count >1

如果您已经知道数组中元素的数量,那么使用 math(= 将长度除以 2)而不是循环会更简单:

def median_finder(array)
  array = array.sort
  if array.length.odd?
    array[array.length / 2]
  else
    array[array.length / 2 - 1, 2].inject(:+) / 2.0
  end
end

inject(:+)是红宝石求和的方式。 array[array.length / 2 - 1, 2] 将数组中间的两个元素放在一起,因此您实际上可以将该行替换为如下所示的内容:

    median1, median2 = array[array.length / 2 - 1, 2]
    (median1 + median2) / 2.0

最新更新