
给定一个包含n个整数的数组,要求将数组中的元素向前移动m个位置,即数组的前n-m个元素顺序向后移动m个位置,最后m个元素移动到数组的最前面。例如,给定数组[1, 2, 3, 4, 5]和m=2,则数组变为[4, 5, 1, 2, 3]。

最直观的方法是使用一个额外的数组来存储旋转后的结果,然后将结果复制回原数组。这种方法简单易懂,但需要额外的空间。
public class ArrayRotate {
public static void rotate(int[] nums, int m) {
if (nums == null || nums.length == 0) return;
int n = nums.length;
m %= n; // 处理m大于n的情况
if (m == 0) return;
int[] temp = new int[m];
System.arraycopy(nums, n - m, temp, 0, m); // 复制最后m个元素到临时数组
System.arraycopy(nums, 0, nums, m, n - m); // 将前n-m个元素向后移动m个位置
System.arraycopy(temp, 0, nums, 0, m); // 将临时数组的内容复制到数组的最前面
}
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5};
int m = 2;
rotate(nums, m);
for (int num : nums) {
System.out.print(num + " ");
}
}
}更高效的方法是通过反转数组来实现旋转。具体步骤如下:
这种方法不需要额外的空间,并且时间复杂度为O(n)。
public class ArrayRotate {
public static void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
public static void rotate(int[] nums, int m) {
if (nums == null || nums.length == 0) return;
int n = nums.length;
m %= n; // 处理m大于n的情况
if (m == 0) return;
reverse(nums, 0, n - 1); // 反转整个数组
reverse(nums, 0, m - 1); // 反转前m个元素
reverse(nums, m, n - 1); // 反转剩余的n-m个元素
}
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5};
int m = 2;
rotate(nums, m);
for (int num : nums) {
System.out.print(num + " ");
}
}
}
这个问题可以通过多种方式解决,这里我将提供一个使用Java实现的示例代码。这个例子中,我们将使用数组来存储这些整数,并通过循环和临时数组来实现数组元素的旋转。
给定一个包含 n 个整数的数组 arr 和一个整数 m,我们需要将数组中的前 n-m 个元素向后移动 m 个位置,最后 m 个元素移动到数组的最前面。
假设我们有一个数组 arr = [1, 2, 3, 4, 5] 和 m = 2,那么经过操作后,数组应该变为 [4, 5, 1, 2, 3]。
public class ArrayRotation {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
int m = 2;
// 调用旋转方法
rotateArray(arr, m);
// 打印旋转后的数组
System.out.println("Rotated array:");
for (int num : arr) {
System.out.print(num + " ");
}
}
public static void rotateArray(int[] arr, int m) {
int n = arr.length;
if (n == 0 || m % n == 0) {
return; // 如果数组为空或m是n的倍数,不需要旋转
}
m = m % n; // 处理m大于n的情况
// 使用临时数组来存储最后m个元素
int[] temp = new int[m];
for (int i = 0; i < m; i++) {
temp[i] = arr[n - m + i];
}
// 将前n-m个元素向后移动m个位置
for (int i = n - m - 1; i >= 0; i--) {
arr[i + m] = arr[i];
}
// 将临时数组中的元素放到数组的最前面
for (int i = 0; i < m; i++) {
arr[i] = temp[i];
}
}
}main):arr 和一个整数 m。rotateArray 方法进行数组旋转。rotateArray):n。m 是 n 的倍数,则直接返回。m % n 以处理 m 大于 n 的情况。temp 来存储数组的最后 m 个元素。n-m 个元素向后移动 m 个位置。temp 中的元素放到数组的最前面。对于输入数组 [1, 2, 3, 4, 5] 和 m = 2,输出将是:
Rotated array:
4 5 1 2 3
这个问题可以通过多种方法来解决,但这里我将介绍一种比较直观且效率较高的方法:通过三次反转数组来实现。
给定一个整数数组 nums 和一个非负整数 m,要求将数组的前 n-m 个元素向后移动 m 个位置,最后 m 个元素移到数组的最前面。
m 个元素:然后将前 m 个元素反转。n-m 个元素:最后将剩余的 n-m 个元素反转。假设我们有一个数组 nums = [1, 2, 3, 4, 5] 和 m = 2,目标是将数组变为 [4, 5, 1, 2, 3]。
[1, 2, 3, 4, 5][5, 4, 3, 2, 1]m 个元素:m 个元素:[5, 4][4, 5][4, 5, 3, 2, 1]n-m 个元素:n-m 个元素:[3, 2, 1][1, 2, 3][4, 5, 1, 2, 3]
public class ArrayRotation {
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5};
int m = 2;
rotate(nums, m);
for (int num : nums) {
System.out.print(num + " ");
}
}
public static void rotate(int[] nums, int m) {
if (nums == null || nums.length == 0 || m < 0) {
throw new IllegalArgumentException("Invalid input");
}
int n = nums.length;
m = m % n; // 处理 m 大于数组长度的情况
reverse(nums, 0, n - 1); // 反转整个数组
reverse(nums, 0, m - 1); // 反转前 m 个元素
reverse(nums, m, n - 1); // 反转剩余的 n-m 个元素
}
private static void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
}main:nums 和旋转次数 m。rotate 方法进行数组旋转。rotate:m(处理 m 大于数组长度的情况)。reverse 方法三次,分别反转整个数组、前 m 个元素和剩余的 n-m 个元素。reverse:这种方法的时间复杂度为 O(n),空间复杂度为 O(1),非常高效。希望这个解释对你有帮助!如果有任何问题或需要进一步的说明,请随时告诉我。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。