otate Array(旋转数组)
Rotate an array of n elements to the right by k steps.
For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].
Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
旋转n个元素向右移k步的阵列
例如:n = 7,k = 3. 数组[1, 2, 3, 4, 5, 6, 7]旋转以后得到的数组是[5,6,7,1,2,3,4]
提示:尝试尽可能多的方法来实现,至少有三种方法可以解决这个问题。
假设:[1,2,3,4,5,6,7]当k=3时,分界点是5。
思路一:
从5开始,逐个将5以后的数移动到指定位置。
第一步得到[5, 1, 2, 3, 4, 6, 7].
第二步得到[5, 6, 1, 2, 3, 4, 7]
第三步得到[5, 6, , 71, 2, 3, 4](即为所得)
具体实现代码:
void rotate(int nums[], int n, int k) {
int temp;
for (int step = 0; step
temp = nums[n-1];
for (int i = n-1; i > 0; --i)
{
nums[i] = nums[i-1];
}
nums[0] = temp;
}
}
提交结果,当数据规模大时,超时。
思路二(算法改进):
先将5以前的数据翻转得到的数组是[4,3,2,1,5,6,7]
再将5及以后的数据翻转得到的数组是[4,3,2,1,7,6,5]
再将整个数组翻转即得到[5,6,7,1,2,3,4]. (即为所求)
具体实现代码:
public static void rotate(int[] nums, int k) {
int length = nums.length;
k = k % length;
if(length == 1)
return;
if(k == 0)
return;
reversal(nums, 0, length - k - 1);
reversal(nums, length -k, length - 1);
reversal(nums, 0, length - 1);
}
public static void reversal(int[] nums, int i, int j){
int t = 0;
while(i = 0){
t = nums[i];
nums[i] = nums[j];
nums[j] = t;
i++;
j--;
}
}
提交结果: