2

假设您有一个List(1,1,1,4,4,1)并且必须计算作为列表头部的元素连续重复了多少次。在上面的例子中,方法应该返回 3。在这个方法中,我们只关心第一个元素。

我走了这么远,卡住了。给定第一个不可重复的字符,我想打破,如何?

 def firstRepeated [X] (xs: List[X]) : Int = xs match {
     case Nil    => 0
     case y::ys  => ys match {
       case Nil   => 0
       case z::zs => if (y == z) 1 + firstRepeated(zs) else // break
     }
 }

另外,在上面的代码中,我认为我没有正确处理 list 的情况z::Nil

任何指针将不胜感激

4

4 回答 4

7

GenSeqLike在(List继承自)中也有一个方法: prefixLength. 这是一个非常简短的答案:

s.prefixLength(_==s.head)
于 2013-01-26T13:20:51.797 回答
2

这是我的做法:

def getHeadCount(xs:List[Int]) = xs.count(_==xs.head)-1
val x = List(1,1,1,4,4,1)
getHeadCount(x) //Returns 3

但是要回答你的问题,你真的不需要打破。我已经浏览了你的代码,根本问题就在这条线上

case z::zs => if (y == z) 1 + firstRepeated(zs) else // break

zs这里不再是您的原始数组,并且在该数组上运行firstRepeated将使用第一个元素进行计数,zs其中可能是也可能不是xs. 以下是我将如何重写您的代码:

def firstRepeated[X](xs: List[X]): Int = xs match {
  case Nil => 0
  case y :: ys => ys match {
    case Nil => 0
    case z :: zs => {
      if (y == z) {
        //println(zs)
        1 + firstRepeated(z :: zs)
      } else {
        firstRepeated(y :: zs)
      }
    }
  }
}                                               //> firstRepeated: [X](xs: List[X])Int

val x = List(1, 1, 1, 4, 4, 1)                  //> x  : List[Int] = List(1, 1, 1, 4, 4, 1)

firstRepeated(x)                                //> res0: Int = 3

如果您对它的实施方式有任何疑问,请查看并告诉我。

于 2013-01-26T06:35:02.443 回答
2
xs.headOption.map(h => xs.takeWhile(_ == h).size).getOrElse(0)
于 2013-01-26T05:49:01.757 回答
2

另一种方法:

xs.span(_ == xs.head)._1.size
于 2013-01-26T06:14:00.297 回答