想要一个可以从列表中查找数字的scala方法,结果是基于给定数字的序列:
def findSeq(baseNum:Int, numbers: List[Int]): List[Int]
如果没有数字适合,只需返回Nil
:
假设:
a number: 3
a list of number: 5,9,2,4,10,6
它将返回:
List(4,5,6)
说明:
由于基数是3,它将尝试从列表中找到4。如果找到,尝试找到5,然后是6,直到找不到预期的。只需返回找到的并对其进行排序。不需要关心重复的数字。
更多测试用例:
findSeq(3, Nil) === Nil
findSeq(3, List(3)) === Nil
findSeq(3, List(5,6)) === Nil
findSeq(3, List(4,5,7)) === List(4,5)
findSeq(3, List(4,7,6)) === List(4)
在Scala中寻找一个优雅的解决方案。
答案 0 :(得分:1)
我猜你可以简单地使用这样的递归:
def findSeq(baseNum:Int, numbers: List[Int]): List[Int] = {
if (numbers.contains(baseNum+1))
(baseNum+1) :: findSeq(baseNum+1, numbers)
else
Nil
}
你的方法需要高效(在某种意义上),还是只是为了好玩?
注意:顺便说一句,您也可以使用Stream,以防您不关心效率。我猜是这样的事情:
def findSeq(baseNum:Int, numbers: List[Int]): List[Int] = {
Stream.from(baseNum+1) takeWhile (numbers.contains) toList
}
答案 1 :(得分:1)
首先进行排序,然后foldLeft似乎更有效
def findSeq(baseNum:Int, numbers: List[Int]) = findSeqSorted(baseNum, numbers.sorted)
def findSeqSorted(baseNum:Int, numbers: List[Int]): List[Int] = {
numbers.foldLeft(List(baseNum))((acc,x) => if(x == acc.head + 1) x :: acc else acc).reverse.tail
}