【问题标题】:How to find numbers from a list, the result are sequences based on a given number?如何从列表中查找数字,结果是基于给定数字的序列?
【发布时间】:2014-12-21 14:02:09
【问题描述】:

想要一个 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 中寻找优雅的解决方案。

【问题讨论】:

  • 为什么返回List(4,5,6)是什么逻辑?
  • 先对数字进行排序。然后,删除所有小于baseNum 的数字。然后,从列表中的第一个数字开始,继续添加其他数字(按顺序),直到最后一个数字与倒数第二个数字之间的差不为 1。

标签: list scala


【解决方案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
}

【讨论】:

  • 好方法。不需要高效,因为在我的实际程序中,列表总是很小
  • 好吧,如果列表很小,你可以做一些更整洁的事情。查看编辑。
【解决方案2】:

先做个排序,然后 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    • 2012-11-20
    • 2015-11-22
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2019-12-25
    相关资源
    最近更新 更多