题目来源:https://leetcode-cn.com
最直观的写法:旋转一步就是将最后一个数置换到最前面(一个一个交换),然后在外部添加一个循环(步数)。
class Solution {
public void rotate(int[] nums, int k) {
int temp=0;
int length=nums.length;
if(k%length==0)System.out.println(Arrays.toString(nums));
if(k%length<length/2){
for(int j=0;j<k%length;j++){
for(int i=nums.length-1;i>0;i--){
temp=nums[i-1];
nums[i-1]=nums[i];
nums[i]=temp;
}
}
}
}
}
但是这样写的话运算花费的时间太长,直接提交LeetCode表示拒绝,提交结果是超时,然后我就多加了一步,就是判断步数是否大于数组的一半是的话就倒过来置换。就变成了下面这样:
int temp=0;
int length=nums.length;
if(k%length==0)System.out.println(Arrays.toString(nums));
if(k%length<length/2){
for(int j=0;j<k%length;j++){
for(int i=nums.length-1;i>0;i--){
temp=nums[i-1];
nums[i-1]=nums[i];
nums[i]=temp;
}
}
}else{
for(int j=0;j<length-k%length;j++){
for(int i=0;i<length-1;i++){
temp=nums[i+1];
nums[i+1]=nums[i];
nums[i]=temp;
}
}
}
但是这样写提交后还是超时,然后我有了下面这种想法:
针对k的值进行批量置换,例如[1,2,3,4,5,6,7,8]步数为2,就会有如下顺序:
①对1,2跟7,8置换-->[7,8,3,4,5,6,1,2]
②将3,4跟1,2置换-->[7,8,1,2,5,6,3,4]
③将5,6跟3,4置换-->[7,8,1,2,3,4,5,6]
大概有个想法但是今天没时间做了,明天研究研究。
修改版的地址:
https://blog.csdn.net/lu_wei_keke/article/details/80722103