交换列表中 x 元素的正确方法

发布于 2024-09-16 12:27:33 字数 274 浏览 5 评论 0原文

我开始学习Scala语言,我有一个问题。您认为以函数式风格交换 List 中第一个和最后一个 x 元素是否是正确的方法?

def swap(l: List[Any], x: Int) = {
  val l1 = l.take(x)
  val l2 = l.slice(x, l.length - x)
  val l3 = l.takeRight(x)
  l3 ::: l2 ::: l1
}

如果 x 超过列表长度的一半,发生什么并不重要。我有兴趣了解算法。

I started to learn Scala language and I have a question. How do you think, is it a right way to swap first and last x elements in List in a functional style?

def swap(l: List[Any], x: Int) = {
  val l1 = l.take(x)
  val l2 = l.slice(x, l.length - x)
  val l3 = l.takeRight(x)
  l3 ::: l2 ::: l1
}

It doesn't matter what happened if x would be more than half list length. I'm interested to find out algorithm.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

单挑你×的.吻 2024-09-23 12:27:33

这段代码是正确的并且具有合理的功能风格。它不是最有效的,因为它必须遍历列表四次才能创建 l1l3 片段。另外,您可能想保留列表包含的类型,因此略有改进是:

def swap[A](l: List[A], x: Int) = {
  val (l1,rest) = l.splitAt(x)
  val (l2,l3) = rest.splitAt(rest.length-x)
  l3 ::: l2 ::: l1
}

This code is correct and is in a reasonable functional style. It's not the most efficient since it has to traverse the list four times to create the pieces l1 through l3. Also, you probably want to preserve the type that the list contains, so a slight improvement is:

def swap[A](l: List[A], x: Int) = {
  val (l1,rest) = l.splitAt(x)
  val (l2,l3) = rest.splitAt(rest.length-x)
  l3 ::: l2 ::: l1
}
迷途知返 2024-09-23 12:27:33

我尝试了一下,效果很好:

scala> swap(List(1, 2, 3, 4, 5),2)
res0: List[Any] = List(4, 5, 3, 1, 2)

你自己提供的代码有什么问题吗?

I tried it and it worked fine:

scala> swap(List(1, 2, 3, 4, 5),2)
res0: List[Any] = List(4, 5, 3, 1, 2)

Is there anything wrong with the code you provided yourself?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文