"Find the Parity Outlier Code Wars (Scala)"
"Find the Parity Outlier Code Wars (Scala)"
我最近在做一些 CodeWars 挑战,我遇到了这个问题。
"You are given an array (which will have a length of at least 3, but could be very large) containing integers. The array is either entirely comprised of odd integers or entirely comprised of even integers except for a single integer N. Write a method that takes the array as an argument and returns this "异常值“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
}
您的代码可以很好地处理负数。问题是您依赖可变状态,它会在代码的 运行 之间泄漏。您的代码行为如下:
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 语句也是如此。
我最近在做一些 CodeWars 挑战,我遇到了这个问题。
"You are given an array (which will have a length of at least 3, but could be very large) containing integers. The array is either entirely comprised of odd integers or entirely comprised of even integers except for a single integer N. Write a method that takes the array as an argument and returns this "异常值“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
}
您的代码可以很好地处理负数。问题是您依赖可变状态,它会在代码的 运行 之间泄漏。您的代码行为如下:
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 语句也是如此。