如果数字数组的均值和模式相等,我试图返回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)
我不知道如何进一步解决它。请帮忙。
答案 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
。