【发布时间】:2017-08-12 12:57:48
【问题描述】:
我尝试在 leetcode (https://leetcode.com/problems/two-sum/#/description) 中制定算法的功能实现
我想我需要的是以下 3 个函数:
-
List[Int] => List[(Int, Int)]用位置压缩元素 -
List[(Int, Int)], Int, Int => List[((Int, Int) , (Int, Int))]压缩元素和位置,其余元素和位置和过滤器使用 Sum -
List[((Int, Int) , (Int, Int))] => List[(Int, Int)]映射到该位置
代码如下所示:
def findTwoSumElements(xs: List[Int], sum: Int): List[(Int, Int)] = {
val zipWithIndex = xs.zipWithIndex
var tailElements = zipWithIndex
val result = zipWithIndex.map(t => {
val element = zipAndFilter(tailElements, t, sum)
tailElements = tailElements.tail
element
}
)
result.flatten.map(t => (t._1._2, t._2._2))
}
private def zipAndFilter(xs: List[(Int, Int)], x: (Int, Int), sum: Int): List[((Int, Int), (Int, Int))] = {
xs.map(t => (t, x)).filter(t => (t._1._1 + t._2._1) == sum)
}
println(findTwoSumElements(List(1,2,3,4), 10)) //List()
println(findTwoSumElements(List(1,2,3,4), 7)) //List((3,2))
println(findTwoSumElements(List(1,2,3,4), 5)) //List((3,0), (2,1))
println(findTwoSumElements(List(), 5)) //List()
我想通过不使用var来改进这部分代码
var tailElements = zipWithIndex
val result = zipWithIndex.map(t => {
val element = zipAndFilter(tailElements, t, sum)
tailElements = tailElements.tail
element
}
)
原因是我想去掉重复的Tuple[Int, Int],比如不变异尾巴就会一起返回(x, y)和(y, x)
我可以提供一些关于如何改进它以及整个实现的建议或演示代码
【问题讨论】:
标签: scala functional-programming