检查列表是否有间隙的函数

4
我只需要一个函数,如果一个List[Integer]的所有元素都是连续的,即返回true
noGaps(List(3,4,5)) // true
noGaps(List(4,3,5)) // false
noGaps(List(3,4,6)) // false

我有一个能用但有点啰嗦的东西 - 什么是最优雅的解决方案?

3个回答

13

这个怎么样?

def noGaps(xs: Seq[Int]) =
  xs.size < 2 || xs.sliding(2).forall { case Seq(x, y) => y == x + 1 }

3
我将此命名为“滑动规则”:总是需要两次尝试才能做到正确。首先,你做对了它。然后,你还要考虑序列大小小于滑动窗口的情况,再做一遍正确的操作。 - huynhjl
1
Scala标准库对我来说仍然充满惊喜。在你指出之前我不知道这个方法。 - Dylan
1
不错的解决方案。如果没有if语句,它将是:xs.sliding(2).forall { case Seq(x, y) => y == x + 1; case _ => true } - Stefan Endrullis

0
def noGaps(xs: Seq[Int]) = xs.isEmpty||xs.tail == xs.map(_+1).init

0

您可以明确指出将ListRange进行比较:

def noGaps(l: Seq[Int]): Boolean =
  l.isEmpty || l.sameElements(l.head to l.last)

请注意,尽管这种方法很优雅,但与滑动解决方案相比效率略低,因为l.last的时间复杂度是O(n)。如果n是列表的大小,i是第一个存在间隙的元素(或者如果没有间隙,则为n),那么滑动解决方案将在i步内完成,而这个方法需要n + i步。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接