"Найдите кодовые выпадающие кодовые войны (Scala)" - PullRequest
1 голос
/ 13 июня 2019

Недавно я решаю некоторые проблемы CodeWars, и у меня есть проблема с этим.

"Вам дан массив (который будет иметь длину не менее 3, но может быть очень большим), содержащий целые числа. Массив либо целиком состоит из нечетных целых чисел, либо полностью состоит из четных целых, за исключением одного целого числа N . Напишите метод, который принимает массив в качестве аргумента и возвращает этот "выброс" N. "

Я посмотрел на некоторые решения, которые уже есть на нашем сайте, но я хочу решить проблему, используя мой собственный подход.

Основная проблема в моем коде, похоже, в том, что он игнорирует отрицательные числа, хотя я реализовал метод Math.abs () в scala.

Если у вас есть идея, как обойти это, это более чем приветствуется.

Большое спасибо

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 Ответ

4 голосов
/ 13 июня 2019

Ваш код отлично обрабатывает отрицательные числа.Проблема в том, что вы полагаетесь на изменчивое состояние, которое просачивается между запусками вашего кода.Ваш код ведет себя следующим образом:

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.

...