【问题标题】:Function to check if a list has no gaps检查列表是否没有间隙的功能
【发布时间】:2011-08-03 12:54:20
【问题描述】:

如果List[Integer] 的所有元素相互跟随,我只想要一个返回true 的函数,即

noGaps(List(3,4,5)) // true
noGaps(List(4,3,5)) // false
noGaps(List(3,4,6)) // false

我有一些可行的方法,但有点冗长 - 最优雅的解决方案是什么?

【问题讨论】:

    标签: list function scala scala-collections


    【解决方案1】:

    这个怎么样?

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

    【讨论】:

    • 我在此将其命名为“滑动规则”:总是需要两次尝试才能做到正确。首先你做对了。 那么当seq大小小于滑动窗口的情况下你会这样做......
    • scala 标准库对我来说仍然充满了惊喜。在你指出之前我不知道这种方法。
    • 不错的解决方案。如果没有 if 语句,它将是: xs.sliding(2).forall { case Seq(x, y) => y == x + 1; case _ => 真 }
    【解决方案2】:
    def noGaps(xs: Seq[Int]) = xs.isEmpty||xs.tail == xs.map(_+1).init
    

    【讨论】:

      【解决方案3】:

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

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

      请注意,尽管优雅,但由于l.lastO(n),这比sliding solution 的效率略低。如果n 是列表的大小并且i 是第一个存在间隙的元素(或者n,如果没有间隙),则将在i 步骤中执行滑动解决方案,而执行此步骤在n + i 步骤中。

      【讨论】:

        猜你喜欢
        • 2019-10-31
        • 2020-03-14
        • 1970-01-01
        • 2012-01-10
        • 1970-01-01
        • 2015-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多