“查找奇偶校验异常值代码战争(Scala)”

“查找奇偶校验异常值代码战争(Scala)”,scala,outliers,parity,Scala,Outliers,Parity,我最近在做一些代码战挑战,我对这个有一个问题 您将得到一个长度至少为3的数组,但可能包含非常大的整数。数组要么完全由奇数整数组成,要么完全由偶数整数组成,只有一个整数N除外。请编写一个方法,将数组作为参数并返回此异常值N 我已经在我们的网站上看到了一些解决方案,但是我想用我自己的方法来解决这个问题 我的代码中的主要问题似乎是它忽略了负数,即使我在scala中实现了Math.abs方法 如果你知道如何避开它,那就太受欢迎了 非常感谢 object Parity { var even = 0

我最近在做一些代码战挑战,我对这个有一个问题

您将得到一个长度至少为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
  }

您的代码可以处理负数。问题是您依赖可变状态,这会在代码运行之间泄漏。您的代码的行为如下所示:

val l = List(1,3,5,6,7)
println(Parity.findOutlier(l)) //6
println(Parity.findOutlier(l)) //7
println(Parity.findOutlier(l)) //7
第一次运行是正确的。但是,当您第二次运行它时,偶数、奇数和结果都会保留上次运行的值。如果在findOutlier方法中而不是在Parity对象中定义它们,那么代码将给出正确的结果


此外,我强烈建议阅读Scala列表中可用的方法。您几乎不需要循环浏览这样的列表,而且有许多更简洁的解决方案。可变变量在Scala代码中也是一个相当大的危险信号,过量的if语句也是如此。

代码的主要问题是可变变量变量的使用以及多次遍历整个集合的事实。效率很低,完全没有必要。您可以尝试格式化代码以使其更具可读性。代码有什么问题?它是否在特定输入上失败?如果是,请将其包括在问题中。或者它崩溃了或者没有时间了?对格式的主要抱怨是代码本身的风格不一致。通常,你应该根据你在结构中的深度来缩进线条。查看有关缩进、嵌套和控件结构的Scala样式指南条目,以获取有关如何更好地设置其格式的建议:您可以点击问题下方的编辑按钮来稍微清理代码,并将测试添加到问题中。提示:如果您要查找奇数或偶数,可以从前三个数字计算出来。这就是为什么它的长度至少为3