-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

配列のインデックスはゼロです。したがって、長さが 4 の場合、インデックス1との平均を取る必要があり2ます。あなたの現在の試みは、インデックスの平均と4の長さを取り3ます2.したがって、1つの小さなことを変更する必要があります(プラスをマイナスに):

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

偶数番号の Fixnum のn場合、これは常に true: です。これは( n - 1 ) / 2 == ( n / 2 ) - 1、見つけたものと同様のアプローチを見つけたことを意味します。これはそれほど驚くべきことではありません。中央値を効率的に計算する方法は限られています。

于 2013-08-26T19:15:12.873 に答える
0

これがあなたの問題全体に対する私の解決策です。-1 を使用する必要があるのは、「arr[(arr.length/2)-1]」の理由です。また、2.to_f の代わりに 2.0 を使用することもできます。

#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 に答える