Трудное время для понимания кода Scala, который возвращает индексы двух чисел - PullRequest
0 голосов
/ 07 января 2020

Мне трудно понять m.get и m + (x._1 -> x._2) в приведенном ниже коде, может кто-нибудь сообщить мне, что он делает

object Solution {
    def twoSum(nums: Array[Int], target: Int): Array[Int] = {
      nums.zipWithIndex.foldLeft(Map.empty[Int,Int])((m,x)=>
      {
          if(m.get(target - x._1)==None)
              m+(x._1 -> x._2)
        else
            return Array(m.getOrElse(target-x._1, -1), x._2)
    })
    null
  }
}

Этот код возвращает индексы двух чисел, так что они складываются до заданной c цели.

Ответы [ 2 ]

2 голосов
/ 07 января 2020

Вот несколько разных (лучше?) Способов получить один и тот же результат (по сути, один и тот же).

Если вы хотите, чтобы все пары индексов, чьи значения суммировались с целью.

def twoSum(nums :Array[Int], target :Int) :Iterator[Seq[Int]] =
  nums.indices
      .combinations(2)
      .filter{case Seq(a,b) => nums(a) + nums(b) == target}

twoSum(Array(3,5,11,2,13,9), 41)  //returns empty Iterator
twoSum(Array(3,5,11,2,13,9), 14)  //returns Iterator(Seq(0, 2), Seq(1, 5))

Если вы хотите получить только первую пару, которая суммируется с целью (с досрочным прекращением).

def twoSum(nums :Array[Int], target :Int) :Option[Seq[Int]] =
  nums.indices
      .combinations(2)
      .find{case Seq(a,b) => nums(a) + nums(b) == target}

twoSum(Array(3,5,11,2,13,9), 41)  //returns None
twoSum(Array(3,5,11,2,13,9), 14)  //returns Some(Seq(0, 2))

Если вы хотите избежать Option и просто вернуть пустую коллекцию, если нет двух значений, сумма в цель.

def twoSum(nums :Array[Int], target :Int) :Seq[Int] =
  nums.indices
      .combinations(2)
      .find{case Seq(a,b) => nums(a) + nums(b) == target}
      .getOrElse(Seq())

twoSum(Array(3,5,11,2,13,9), 41)  //returns Seq()
twoSum(Array(3,5,11,2,13,9), 14)  //returns Seq(0, 2)
2 голосов
/ 07 января 2020

Вот более эффективный и идиоматический c способ решения этой проблемы.

def twoSum(nums: ArraySeq[Int], target: Int): Option[(Int, Int)] = {
  val allIndexes = for {
    i <- Iterator.range(start = 0, end = nums.length)
    j <- Iterator.range(start = i + 1, end = nums.length)
  } yield i -> j

  allIndexes.find {
    case (i, j) => (nums(i) + nums(j)) == target
  }
}

( Примечание: ArraySeq похож на любой обычный массив, но он неизменен, он был введен в 2.13, если вы используете более старую версию, просто используйте обычный Array) .

...