我最近正在做一些CodeWars挑战,而我对此有疑问。
“您将获得一个包含整数的数组(长度至少为3,但可能会非常大)。该数组要么完全由奇数整数组成,要么完全由偶数整数组成,除了单个整数N 。写一个将数组作为参数并返回此“异常值” N的方法。
我已经查看了一些解决方案,这些解决方案已经在我们的网站上了,但是我想使用自己的方法解决问题。
我的代码中的主要问题似乎是,即使我在scala中实现了Math.abs()方法,它也忽略了负数。
如果您有解决该问题的想法,那就太好了。
非常感谢
object Parity {
var even = 0
var odd = 0
var result = 0
def findOutlier(integers: List[Int]): Int = {
for (y <- 0 until integers.length) {
if (Math.abs(integers(y)) % 2 == 0)
even += 1
else
odd += 1
}
if (even == 1) {
for (y <- 0 until integers.length) {
if (Math.abs(integers(y)) % 2 == 0)
result = integers(y)
}
} else {
for (y <- 0 until integers.length) {
if (Math.abs(integers(y)) % 2 != 0)
result = integers(y)
}
}
result
}
答案 0 :(得分:4)
您的代码可以很好地处理负数。问题是您依赖于可变状态,这会在代码运行之间泄漏。您的代码的行为如下:
val l = List(1,3,5,6,7)
println(Parity.findOutlier(l)) //6
println(Parity.findOutlier(l)) //7
println(Parity.findOutlier(l)) //7
第一次运行是正确的。但是,当您第二次运行它时,even
,odd
和result
的所有值仍来自您先前运行的值。如果您在findOutlier
方法内部而不是在Parity
对象中定义它们,那么您的代码将提供正确的结果。
此外,我强烈建议您阅读Scala List
可用的方法。您几乎永远不需要像这样遍历List
,并且有许多更简洁的解决方案。可变var
在Scala代码中也是一个很大的危险信号,if语句也是如此。