0

这是一种计算数组中值的解决方案。我得到了前三行,duh ;),但第三行是魔法发生的地方。有人能解释一下'sorted'变量是如何使用的,为什么它在括号旁边,为什么另一个变量'len'被括在这些括号中,然后是括号?就像 sorted 突然被用作数组一样?谢谢!

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

  puts median([3,2,3,8,91])
  puts median([2,8,3,11,-5])
  puts median([4,3,8,11])
4

3 回答 3

1

考虑一下:

[1,2,2,3,4] 和 [1,2,3,4]。两个数组都已排序,但分别具有奇数和偶数个元素。因此,那段代码考虑了这两种情况。

sorted确实是一个数组。您对 [2,3,1,4] 进行排序,然后返回 [1,2,3,4]。然后计算中间索引(len - 1) / 2len / 2偶数/奇数个元素,并找到它们的平均值。

于 2013-05-21T06:55:56.210 回答
1

是的,array.sort 正在返回一个数组,它被分配给 sorted。然后,您可以通过数组索引访问它。

如果您有奇数个元素,例如示例中的 5 个元素,则索引为:

(len-1)/2=(5-1)/2=2

len/2=5/2=2 --- (remember this is integer division, so the decimal gets truncated)

所以你取索引 2 处的值并将它们相加,然后除以 2,这与索引 2 处的值相同。

如果你有偶数个元素,比如 4,

(len-1)/2=(4-1)/2=1 --- (remember this is integer division, so the decimal gets truncated)

len/2=4/2=2

因此,在这种情况下,您实际上是在平均两个中间元素 1 和 2,这是当您有偶数个元素时的中位数定义。

于 2013-05-21T06:58:46.453 回答
0

就像 sorted 突然被用作数组一样?

是的。在第 2 行,它被初始化为与输入具有相同元素的数组,但按升序排列(默认排序为升序)。在第 3 行,你有len它是用数组的长度初始化的sorted,所以是的,sorted从那时起就被用作数组,因为它就是这样。

于 2013-05-21T07:00:16.560 回答