Scala добавить элемент в список Nil в scala - PullRequest
2 голосов
/ 19 февраля 2020

Я решаю проблему с leetcode- https://leetcode.com/problems/minimum-absolute-difference/

Кажется, я не могу понять, почему в приведенном ниже коде список результатов неправильно добавляется после сброса в ноль. Конечно, я смотрел онлайн, но не мог понять концепцию такого поведения. Может кто-нибудь объяснить, почему после присвоения результата Nil, никакое значение не может быть добавлено в этот список? Как мне сбросить список? Я пробовал с ListBuffer и clear(), но у меня возникла та же проблема, в конце выполнения результат равен Nil

Ожидаемое поведение: Вход: arr = [4,2,1,3] Выход: [[1,2],[2,3],[3,4]]

Фактическое поведение: ввод: arr = [4,2,1,3] вывод: List()

  def minimumAbsDifference(arr: Array[Int]): List[List[Int]] = {
    val sortedInput = arr.sorted
    var min = Integer.MAX_VALUE
    var result = Seq[List[Int]]()
    for(i <- 0 until sortedInput.length - 1){
      val diff = sortedInput(i+1) - sortedInput(i)
      if(min > diff){
         result = Nil
         min = diff
      }
      if(min == diff){
        result :+ List(sortedInput(i),sortedInput(i+1))
      }
    }
    result.toList
  }

1 Ответ

3 голосов
/ 19 февраля 2020

Вы присваиваете Nil для result, а затем никогда не назначаете ничего другого.

Поскольку List является неизменным result :+ List(...) возвращает новый список, который затем выбрасывается. Вам нужно назначить новый список на result.

Несколько других примечаний:

  • Крайне неэффективно (решительно не "leet") добавлять к список. Гораздо эффективнее предварительно добавить (построить результат в обратном порядке), а затем развернуть в конце.

  • Также крайне неэффективно получить доступ к элементам List по индексу.

  • Как правило, следует избегать использования var в Scala, хотя это конкретное использование (содержащееся локально для другой чистой функции) не выходит за рамки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...