检查数组的均值和模式是否相等

时间:2014-10-10 01:21:37

标签: ruby mean mode

如果数字数组的均值和模式相等,我试图返回1,否则返回0。我的代码是

def MeanMode(arr)
  arrunq = arr.uniq
  if arrunq.length == arr.length
    return 0
  end
  lendiff = arr.length - arrunq.length
  mode = 0
  arr.each do |x|
    if arr.scan(x).length - 1 == lendiff 
      mode += x
    end
  end
  mean = (arr.inject(:+))/(arr.length)
  if mode == mean
    return 1
  end
end
puts MeanMode([1, 2, 3, 3])

在测试时,我收到了这个错误。

private method `scan' called for [1, 2, 3, 3]:Array (NoMethodError)

我不知道如何进一步解决它。请帮忙。

2 个答案:

答案 0 :(得分:0)

它告诉你,在第9行,你试图在一个数组上调用扫描。

数组没有扫描方法。在我的头脑中,我唯一能想到的扫描方法是String,它采用正则表达式参数。

你是否想要计算数组中x的匹配?

如果是这样,你需要Array.count(obj)

if arr.count(x) -1 == lendiff

你还需要在结尾处返回一个0,否则你将获得nil而不是mode!= mean

if mode == mean
  1
else
  0
end

(假设你的其余代码工作 - 我没有评估逻辑 - 只是语法)

答案 1 :(得分:0)

我收到了错误," NoMethodError:未定义的方法' scan'对于[1,2,3,3]:数组",这是我的预期,因为类Array没有方法scan。也许你对String#scan感到困惑。我不知道你是如何得到私人方法的#34;消息。

arrunq = arr.uniq
if arrunq.length == arr.length
  return 0
end
例如,如果

将是一个问题

arr = [2]

arr = [2,2,2]

此处的均值和模式均为2,因此您的方法应返回1

让我们首先计算均值,使用arr的示例:

arr = [1, 2, 3, 3]

numerator = arr.reduce(:+) #=> 9
denominator = arr.size     #=> 4

如果arr的值都是整数(如示例所示),则模式将为整数。因此,如果均值不是整数,则均值不能等于模式,因此您的方法应该返回0(为什么不是false?)。当且仅当:

时,均值为整数
numerator % denominator == 0

所以我们可以添加声明;

return 0 unless numerator % denominator == 0

在我使用的示例中,等式的左侧是:

9 % 4 = 1

所以我们可以在不计算模式的情况下返回0

假设:

arr = [1,3,4,4]

我们计算:

numerator = arr.reduce(:+) #=> 12
denominator = arr.size     #=> 4
numerator % denominator    #=> 12 % 4 => 0

所以在这种情况下我们需要计算均值和模式,看看它们是否相等:

mean = numerator/denominator
      #=> 2 
mode, count = arr.uniq.map { |n| [n, arr.count(n)] }.max_by(&:last)
      #=> [3,2]
mode  #=> 3
count #=> 2

mean != mode,我们再次返回0

计算模式的方法有很多种。我选择的方法是执行以下三个步骤:

u = arr.uniq
  #=> [1, 2, 3]
a = u.map { |n| [n, arr.count(n)] }
  #=> [[1, 1], [2, 1], [3, 2]]
a.max_by(&:last) 
  #=> [3, 2]

再考虑一个案例:

arr = [1,2,3,3,4,4,11]

numerator = arr.reduce(:+) #=> 28
denominator = arr.size     #=> 7
numerator % denominator    #=> 28 % 7 => 0
mean = numerator/denominator
  #=> 4

mode, count = arr.uniq.map { |n| [n, arr.count(n)] }.max_by(&:last)
  #=> [3, 2]
mode
  #=> 3
count
  #=> 2

这里有一个关于模式定义的问题。一种选择如下:

a = arr.uniq.map { |n| [n, arr.count(n)] }
  #=> [[1, 1], [2, 1], [3, 2], [4, 2], [11, 1]]
mx = a.max_by(&:last).last
  #=> 2
mode = a.select { |_, count| count == mx }.map(&:first)
  #=> [3, 4]

mode.include?(mean) #=> [3, 4].include?(4) => true

因此,如果我们以这种方式解释模式,我们就会返回1