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