提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
用scala实现旋转数组
一、旋转数组是什么?
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]
二、具体实现
1.方法1
代码如下:
先将数组最后一个值赋给一个临时变量tmp
在从倒数第二个元素开始遍历,将当前的元素的值赋给下一个元素
最后将tmp的值赋值给第一个元素
将此操作进行几次就是往右旋转几步
def rotate1(nums: Array[Int], k: Int): Unit = {
val len=nums.length-1
for (_ <- 1 to k%nums.length){//向右旋转几步
val tmp=nums(len)
for (ind <- (0 to len-1).reverse)
nums(ind+1)=nums(ind)
nums(0)=tmp
}
}
2.方法2
代码如下:
//方法2
//原始数组 : 1 2 3 4 5 6 7
//反转所有数字后 : 7 6 5 4 3 2 1
//反转前 k 个数字后 : 5 6 7 4 3 2 1
//反转后 n-k 个数字后 : 5 6 7 1 2 3 4 --> 结果
def rotate2(nums: Array[Int], k: Int): Unit = {
val len=nums.length
reverseInt(nums, 0, len - 1);
reverseInt(nums, 0, k%len - 1);
reverseInt(nums, k%len, len - 1);
}
//对索引从start1到end1的数据进行翻转
def reverseInt(s: Array[Int],start1:Int,end1:Int): Unit = {
var start=start1
var end=end1
while (start<end){
var tmp=s(start)
s(start)=s(end)
s(end)=tmp
start+=1
end-=1
}
}