"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

第一个运行是正确的。但是,当您第二次 运行 时,evenoddresult 都保留了之前 运行 的值。如果您在 findOutlier 方法中而不是在 Parity 对象中定义它们,那么您的代码会给出正确的结果。

此外,我强烈建议您通读 Scala List 可用的方法。你应该几乎永远不需要像那样循环遍历 List ,并且有许多更简洁的问题解决方案。可变的 var 在 Scala 代码中也是一个非常大的危险信号,过多的 if 语句也是如此。