“查找奇偶校验离群码战争(Scala)”

时间:2019-06-13 18:04:22

标签: scala outliers parity

我最近正在做一些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
  }

1 个答案:

答案 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

第一次运行是正确的。但是,当您第二次运行它时,evenoddresult的所有值仍来自您先前运行的值。如果您在findOutlier方法内部而不是在Parity对象中定义它们,那么您的代码将提供正确的结果。

此外,我强烈建议您阅读Scala List可用的方法。您几乎永远不需要像这样遍历List,并且有许多更简洁的解决方案。可变var在Scala代码中也是一个很大的危险信号,if语句也是如此。