// P08 (**) Eliminate consecutive duplicates of list elements.
// If a list contains repeated elements they should be replaced with a single copy of the element. The order of the elements should not be changed.
// Example:
// scala> compress(List('a, 'a, 'a, 'a, 'b, 'c, 'c, 'a, 'a, 'd, 'e, 'e, 'e, 'e))
// res0: List[Symbol] = List('a, 'b, 'c, 'a, 'd, 'e)
def compress[T](xs: List[T]): List[T] = {
// simple reverse (not tail recursion..)
def reverse[T](ys: List[T]): List[T] = ys match {
case Nil => ys
case head :: tail => reverse(tail) ::: List(head)
}
def recursive[T](rest: List[T], result: List[T]): List[T] = rest match{
case Nil => result
case head :: tail if(result.isEmpty || head != result.head) =>
recursive(tail, List(head) ::: result)
case _ :: tail => recursive(tail, result)
}
reverse(recursive(xs, Nil))
}
解答例
またおまえか、foldRight!!
そりゃ、試すさ。
// FoldLeft
def compressFoldL[T](xs: List[T]): List[T] =
xs.foldLeft(List[T]()){ (acc, x) =>
if(acc.isEmpty || acc.last != x) acc ::: List(x)
else acc
}
// /: (FoldLeft)
def compressFoldL2[T](xs: List[T]): List[T] =
(List[T]() /: xs){ (acc, x) =>
if(acc.isEmpty || acc.last != x) acc ::: List(x)
else acc
}
// FoldRight
def compressFildR[A](xs: List[A]): List[A] =
xs.foldRight(List[A]()) { (x, acc) =>
if (acc.isEmpty || acc.head != x) x :: acc
else acc
}
// :\ (FoldRight)
def compressFildR2[A](xs: List[A]): List[A] =
(xs :\ List[A]()) { (x, acc) =>
if (acc.isEmpty || acc.head != x) x :: acc
else acc
}
No comments:
Post a Comment