理解返回两个数字的索引的Scala代码的时间

问题描述 投票:0回答:2

我在下面的代码中很难理解m.getm +(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
  }
}

此代码返回两个数字的索引,以便它们加起来成为一个特定的目标。

scala scala-collections
2个回答
2
投票

这里有几种不同(更好?)的方法来获得相同的结果(基本上相同)。

如果要所有其值总和为目标的索引对。

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
投票

这是解决该问题的更有效,更惯用的方法。

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] 。

© www.soinside.com 2019 - 2024. All rights reserved.