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