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

时间:2014-12-05 06:49:45

标签: ruby arrays methods median

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

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

3 个答案:

答案 0 :(得分:0)

你的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

答案 1 :(得分:0)

您使用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

答案 2 :(得分:0)

如果您已经知道数组中元素的数量,那么使用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