我正在尝试使用数组反转方法从特定位置旋转数组。
输入数组: 1,2,3,4,5,6,7 d=3输出数组: 5,6,7,1,2,3,4
为了实现这一点,我想用三个步骤来处理数组。Step1:将数组从起始位置反转到d => 4,3,2,1,5,6,7 Step2:从d反转数组到数组末尾=> 4,3,2,1,7,6,5 Step3:从Step2 => 5,6,7,1,2,3,4反转整个数组
我没有遵循任何函数式编程模式,因为我想一步一步地检查算法。
  val arr = Array[Int](1, 2, 3, 4, 5, 6, 7)
  def reverseAlgo(brr: Array[Int], start: Int, end: Int): Unit = {
    var temp = 0
    for(i <- start until end/2) {
      temp = brr(i)
      brr(i) = brr(end-i-1)
      brr(end-i-1) = temp
    }
    brr.foreach(println)
  }Step1工作得很好:
  reverseAlgo(arr, 0, 3)输出:
3
2
1
4
5
6
7但是Step2没有生成所需的输出:
  reverseAlgo(arr, 3, 7)输出:
3
2
1
4
5
6
7如您所见,数组的输出应该是: 3,2,1,7,6,5,4因为Step2的输出是不正确的,所以最终的输出也是错误的。
Step3:
reverseAlgo(arr, 0, arr.length)输出:
7
6
5
4
1
2
3谁能让我知道我在这里做的错误是什么?
发布于 2021-07-24 00:56:06
为什么不做这样简单的事情呢?
import scala.collection.immutable.ArraySeq
import scala.reflect.ClassTag
def rotate[T : ClassTag](arr: ArraySeq[T])(pos: Int): ArraySeq[T] = {
  val length = arr.length
  ArraySeq.tabulate[T](n = length) { i =>
    arr((i + 1 + pos) % length)
  }
}它可以像这样使用:
rotate(arr = ArraySeq(1, 2, 3, 4, 5, 6, 7))(pos = 3)
// res: ArraySeq[Int] = ArraySeq(, 5, 6, 7, 1, 2, 3, 4)您可以看到运行的代码。
发布于 2021-07-24 01:36:18
只有当范围从零开始时,您的代码才能工作。
for(i <- start until end/2) {
  temp = brr(i)
  brr(i) = brr(end-i-1)
  brr(end-i-1) = temp
}应该是这样的:
for(i <- 0 until (end-start)/2) {
  temp = brr(start+i)
  brr(start+i) = brr(end-i-1)
  brr(end-i-1) = temp
}有了这个改变,你的代码就可以工作了。
发布于 2021-07-24 05:16:21
突变是要避免的,但如果你必须这样做,递归仍然有用。
def reversePart[A](arr: Array[A], start: Int, end: Int): Unit = {
  def loop(a:Int, b:Int): Unit =
    if (a < b) {
      val temp = arr(a)
      arr(a) = arr(b)
      arr(b) = temp
      loop(a+1, b-1)
    }
  loop(start max 0, end min arr.length-1)
}
val test = Array(1, 2, 3, 4, 5, 6, 7)
reversePart(test, 0, 3)   //Array(4, 3, 2, 1, 5, 6, 7)
reversePart(test, 4, 7)   //Array(4, 3, 2, 1, 7, 6, 5)
reversePart(test, -1, 99) //Array(5, 6, 7, 1, 2, 3, 4)https://stackoverflow.com/questions/68502473
复制相似问题