-1

我不知道为什么我不能正确地得到偶数部分。

def median(array)
  array.sort!
  if array.length % 2 == 0                                            #if amount of array members is even
    (array[(array.length/2) + 1] + array[array.length/2]) / 2.to_f    #return average of the 2 middle array members
  else                                                                #if amount of array members is odd
    array[array.length/2.ceil]                                        #return middle number
  end   
end

例如,我的尝试是一个长度为 6 的数组,其第 3 和第 4 个索引值为 7 和 9。

array[6/3+1] + array [6/3]
(array[4] + array[3]) /2
9 + 7 / 2

我收到此错误

Error!
median returns the correct median of an even-length array
expected: 5.5 got: 6.0 (compared using ==)

我看到了一个更短的解决方案,但我很好奇我是否能理解我试图遵循的逻辑路径,感谢您的参与!

我见过的解决方案:

def median(array)
  sorted = array.sort
  len = sorted.length
  return (sorted[(len - 1) / 2] + sorted[len / 2]) / 2.0
end
4

2 回答 2

0

这是我对您的整个问题的解决方案。你需要使用 -1 这就是“arr [(arr.length/2)-1]”的原因。您也可以使用 2.0 而不是 2.to_f。

#Write a method that finds the median of a given array of integers. If the array has an odd number of integers,
# return the middle item from the sorted array. If the array has an even number of integers, 
# return the average of the middle two items from the sorted array.


def find_median(arr)
arr.sort!
  if arr.length.even?
       return (arr[arr.length/2] + arr[(arr.length/2)-1])/2.0
  else #else odd
       return arr[arr.length/2.0]
  end
end

puts find_median([2,3,4,9,7,8])
于 2013-10-19T22:00:36.987 回答
0

数组是零索引的。因此,如果长度为 4,则需要取指数1和的平均值2。您当前的尝试将平均索引32长度为 4。所以您只需要更改一件小事(加到减):

(array[(array.length/2) - 1] + array[array.length/2]) / 2.to_f

对于偶数的 Fixnum n,这总是正确的: ( n - 1 ) / 2 == ( n / 2 ) - 1,这意味着您已经找到了与您找到的方法类似的方法。这并不奇怪,有效计算中位数的方法有限。

于 2013-08-26T19:15:12.873 回答