如何从列表中查找数字,结果是基于给定数字的序列?

时间:2014-12-21 02:54:46

标签: list scala

想要一个可以从列表中查找数字的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中寻找一个优雅的解决方案。

2 个答案:

答案 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
}