要求实现一个对数组进行循环左移的函数:一个数组a中存有n(>0)个整数,将每个整数循环向左移m(≥0)个位置。即将a中的数据由[a0a1...an−1]变换为[amam+1...an−1a0a1...am−1](最前m个数循环移至最后面的m个位置)
这个问题的解题思路可以简要总结为:
- 将数组分为两部分,分别进行反转操作。
- 编写函数实现数组元素反转。
- 在主函数中调用函数,完成循环左移操作。
- 输出结果。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
ArrayShift(a, n, m);
for (int i = 0; i < n; i++) {
if (i != 0) {
System.out.print(" ");
}
System.out.print(a[i]);
}
System.out.println();
}
public static void ArrayShift(int[] a, int n, int m) {
reverse(a, 0, m - 1);
reverse(a, m, n - 1);
reverse(a, 0, n - 1);
}
public static void reverse(int[] a, int start, int end) {
while (start < end) {
int temp = a[start];
a[start] = a[end];
a[end] = temp;
start++;
end--;
}
}
}
-
ArrayShift
方法接收三个参数:数组a
,数组大小n
,左移位数m
。该方法首先调用reverse
方法三次,分别将数组的不同部分进行反转操作,以实现循环左移的效果。 -
reverse
方法接收三个参数:数组a
,起始位置start
,结束位置end
。该方法通过双指针的方式,将起始位置和结束位置的元素交换,然后逐步向中间移动,直到两个指针相遇。这样可以实现对指定区间的数组元素进行反转操作。 -
在
main
方法中,首先读取输入的数组大小n
和左移位数m
,然后依次读入数组元素。接着调用ArrayShift
方法对数组进行循环左移,并输出结果
使用这个方法就可以简单的进行数组循环左移了。