针对上次的博客的修改版:
上次的写法虽然正确但是通不过leetCode的测试,原因是超时运行。
先贴上代码:
class Solution {
public void rotate(int[] nums, int k) {
int temp=0;
k=k%nums.length;
if((nums.length%2==0)&&(nums.length/2==k)){
for(int i=0;i<k;i++){
temp=nums[i];
nums[i]=nums[nums.length-k+i];
nums[nums.length-k+i]=temp;
}
}else if(nums.length/2>=k){
for(int i=0;i<k;i++){
temp=nums[i];
nums[i]=nums[nums.length-k+i];
nums[nums.length-k+i]=temp;
}
for(int j=0;j<k;j++){
for(int i=nums.length-1;i>k;i--){
temp=nums[i-1];
nums[i-1]=nums[i];
nums[i]=temp;
}
}
}else{
for(int i=0;i<nums.length-k;i++){
temp=nums[i];
nums[i]=nums[k+i];
nums[k+i]=temp;
}
for(int j=0;j<nums.length-2*(nums.length-k);j++){
for(int i=k-1;i>0;i--){
temp=nums[i-1];
nums[i-1]=nums[i];
nums[i]=temp;
}
}
}
System.out.println(Arrays.toString(nums));
}
}
分析:
1⃣️ 如果k值刚好是nums长度的一半,那么,直接将前一半跟后一半直接交换就可以了
2⃣️ 如果k值小于nums长度的一半,那么就直接将前k个,跟后k个交换,然后在将交换后的后k个向前移动到前k个后面
3⃣️ 如果k值大于nums长度的一半,那么就将前nums.length-k个跟后nums.length-k个交换,然后将前nums.length-k个移动到 后nums.length-k个前面。
这个算法比我上次写到要快很多,所以leetcode上也能通过。
题目来源:https://leetcode-cn.com