旋转数组

来源:LeetCode初级算法
给定一个数组,将数组中的元素向右轮转 k个位置,其中k是非负数。

示例 :
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]

思路
第一步:将k看做数组后面的k位数字,先反转这k位数字

1

2

3

4

7

6

5

第二步:反转这k位数前面的数字

4

3

2

1

7

6

5

 第三步:反转整个数组

5

6

7

1

2

3

4

初始代码:

public void rotate(int[] nums, int k) {
int length = nums.length;
int temp;
// 1.数组的后k位前后交换
for (int i = length-k; i <=length-1 ; i--) {
temp=nums[length-k];
nums[length-k]=nums[length-1];
nums[length-1]=temp;
}
// 2.前length-k位前后交换
for (int i = 0; i<=(length-k-1)/2; i++) {
temp=nums[i];
nums[i]=nums[length-k-1-i];
nums[length-k-1-i]=temp;
}
// 3.数组前后交换
for (int i =0; i < length/2; i++) {
temp = nums[i];
nums[i] = nums[length - 1 - i];
nums[length - 1 - i] = temp;
}
}
实现了功能后我就急忙提交了但发现超出了规定的时间。。

 


看了下评论区后找到一个和我思路一样的解法,但是写的简洁了许多。


因为三个反转的步骤都用了相同的方法就是头数组元素和尾数组元素进行交换,将这个反转的过程写成方法,不同的只是起始和结束的位置。


 

public void reverse(int[] nums, int start, int end){
while (start < end) {
int temp = nums[start];
nums[start++] = nums[end];
nums[end--] = temp;
}
}

稍作修改后直接在刚刚的方法中调用这个reverse方法,输入起始地址就解决了。

 

posted @ 2021-12-05 22:09  Wavve  阅读(50)  评论(0)    收藏  举报