我得到了这个问题,我以为我已经弄清楚了,但我被告知我做错了。问题是,。给定列表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)
但显然它错了,任何人都可以解释这个问题的要求吗?
答案 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))