【问题标题】:"Find the Parity Outlier Code Wars (Scala)"“查找奇偶校验异常值代码大战 (Scala)”
【发布时间】:2019-10-28 09:16:57
【问题描述】:

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

【问题讨论】:

  • 您的代码的“主要问题”是使用了可变变量 (vars) 以及您多次遍历整个集合的事实。非常低效且完全没有必要。 (并且您可能会尝试格式化代码以使其更具可读性。)
  • 代码有什么问题?它是否在特定输入上失败?如果是 - 请将其包含在问题中。还是会崩溃或超时?
  • 对格式的主要抱怨是代码本身的风格不一致。一般来说,你应该根据你在结构中的深度来缩进行。查看 Scala 样式指南中有关缩进、嵌套和控制结构的条目,以获取有关如何更好地格式化的建议:docs.scala-lang.org/style
  • 您可以点击问题下方的编辑按钮来稍微清理一下您的代码,并将您的测试添加到问题中。
  • 提示:如果您正在寻找奇数或偶数,您可以从前三个数字开始计算。这就是为什么它的长度至少为 3

标签: scala outliers parity


【解决方案1】:

您的代码可以很好地处理负数。问题是你依赖于可变状态,它在你的代码运行之间泄漏。您的代码行为如下:

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 语句也是如此。

【讨论】:

    猜你喜欢
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 2019-03-08
    • 1970-01-01
    相关资源
    最近更新 更多