反转n个元素的列表

时间:2014-11-25 01:01:18

标签: scala

我得到了这个问题,我以为我已经弄清楚了,但我被告知我做错了。问题是,。给定列表xs,反转前n个元素。我想我不明白问题是什么,我想我们拿一个Int n,并反过来返回那个int n前面的前n个元素。

def nthRev[T](n: Int,xs: List[T]): List[T] = xs match {
  case List() => List()
  case head :: rest => (head::rest.take(n)).reverse
}

所以,输出是

nthRev(3,List(1, 2, 3, 4, 5))

返回

List(4, 3, 2, 1)

但显然它错了,任何人都可以解释这个问题的要求吗?

3 个答案:

答案 0 :(得分:3)

我认为这意味着您应该返回一个与原始列表具有相同元素的新列表,但第一个n元素已反转。

def nthRev[T](n: Int, xs: List[T]): List[T] =
  xs.splitAt(n) match { case (a, b) => a.reverse ::: b }

nthRev(3, (1 to 5).toList) // List(3, 2, 1, 4, 5)

答案 1 :(得分:3)

我解释你的问题的方式"给定一个列表xs,反转前n个元素。"和示例

nthRev(3,List(1, 2, 3, 4, 5))

我希望它可以反转前3个元素,但随后会离开列表的其余部分:

List(3, 2, 1, 4, 5)

当问题出现"前n个元素"它是说取代" n"将数字作为示例中的第一个参数" 3",给出"前3个元素"。 3与列表中的元素无关。改变你的榜样:

nthRev(3,List(10,11,12,13,14)

将返回

List(12,11,10,13,14)

答案 2 :(得分:0)

我会选择简单的标准API。看看这篇文章中解释的drop函数:Skip first N elements in scala iterable

def reverseAtN[a](n: Int, list: List[a]): List[a] =
  List.concat(x.take(n).reverse, x.drop(n))