很难理解 returns 索引两个数字的 Scala 代码
Hard Time in understanding the Scala code which returns indices of the two numbers
我很难理解 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
}
}
此代码 returns 两个数字的索引,以便它们加起来达到特定目标。
这是解决该问题的更有效和惯用的方法。
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
).
这里有一些不同的(更好的?)方法来获得相同的结果(本质上是相同的)。
如果您想要其值总和等于目标的所有索引对。
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
并且只是 return 一个空集合,如果没有 2 个值总和达到目标。
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)
这是我自己的做法,该函数循环遍历所有数字对,直到找到答案。它利用了 Scala 的优化递归功能。此外,它仅使用对初学者有用的简单概念:函数、数组、整数和 if-else 语句。
def twoSum(nums :Array[Int], target : Int): Array[Int] = {
def iter(a:Int, b: Int): Array[Int] = {
if(nums(a) + nums(b) == target) Array(a,b)
else if(b < nums.length-1) iter(a,b+1)
else iter(a+1,a+2)
}
iter(0,1)
}
jwvh:是的。失败时为空数组:
def twoSum(nums: Array[Int], target: Int): Array[Int] = {
def iter(a: Int,b: Int): Array[Int] = {
if(nums(a) + nums(b) == target) Array(a,b)
else if(b < nums.length-1) iter(a,b+1)
else if(a < nums.length-2) iter(a+1,a+2)
else Array()
}
iter(0,1)
}
我很难理解 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
}
}
此代码 returns 两个数字的索引,以便它们加起来达到特定目标。
这是解决该问题的更有效和惯用的方法。
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
).
这里有一些不同的(更好的?)方法来获得相同的结果(本质上是相同的)。
如果您想要其值总和等于目标的所有索引对。
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
并且只是 return 一个空集合,如果没有 2 个值总和达到目标。
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)
这是我自己的做法,该函数循环遍历所有数字对,直到找到答案。它利用了 Scala 的优化递归功能。此外,它仅使用对初学者有用的简单概念:函数、数组、整数和 if-else 语句。
def twoSum(nums :Array[Int], target : Int): Array[Int] = {
def iter(a:Int, b: Int): Array[Int] = {
if(nums(a) + nums(b) == target) Array(a,b)
else if(b < nums.length-1) iter(a,b+1)
else iter(a+1,a+2)
}
iter(0,1)
}
jwvh:是的。失败时为空数组:
def twoSum(nums: Array[Int], target: Int): Array[Int] = {
def iter(a: Int,b: Int): Array[Int] = {
if(nums(a) + nums(b) == target) Array(a,b)
else if(b < nums.length-1) iter(a,b+1)
else if(a < nums.length-2) iter(a+1,a+2)
else Array()
}
iter(0,1)
}