整数回退n
个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图。* 写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数。
输入 input
输入数据的个数n n个整数 移动的位置m
输出 output
移动后的n个数
样例输入 sample input
10
1 2 3 4 5 6 7 8 9 10
2
样例输出 sample output
9 10 1 2 3 4 5 6 7 8
编程需要技巧或者说是艺术
对比下面两段代码
private static void goBacknm (int m, int[] aa) {
ArrayList<Integer> arr = new ArrayList <> ( );
//记录要向首位置移动的索引index
int index = 0;
for (int i=0; i<aa.length-m; i++){
arr.add ( i,aa[i] );
if (i+m == aa.length-1){
index = i;
}
}
//表示下一个索引
for (int i=0 ; i<m; i++){
if (index<aa.length){
++index;
arr.add ( i,aa[index] );
}
}
for (int i=0; i<arr.size (); i++){
System.out.print (arr.get ( i )+" ");
}
}
private static void goBacknm (int m, int[] aa) {
...
//表示下一个索引
index++;
for (int i=0 ; i<m; i++){
if (index<aa.length){
arr.add ( i,aa[index] );
index++;
}
}
...
}
代码2,虽然也能运行出来,但是弊端是,数组会越界,因为index 会多自增一次。
代码1,则不会出现多增一次的现象。
完整代码如下:
public class Integer_MoveBackn {
private static void goBacknm (int m, int[] aa) {
ArrayList<Integer> arr = new ArrayList <> ( );
//记录要向首位置移动的索引index
int index = 0;
for (int i=0; i<aa.length-m; i++){
arr.add ( i,aa[i] );
if (i+m == aa.length-1){
index = i;
}
}
for (int i=0 ; i<m; i++){
if (index<aa.length){
++index;
arr.add ( i,aa[index] );
}
}
for (int i=0; i<arr.size (); i++){
System.out.print (arr.get ( i )+" ");
}
}
public static void main (String[] args) {
Scanner sc = new Scanner ( System.in );
//输入数据的个数
// int n = sc.nextInt ();
// int[] aa = new int[n];
// for (int i=0; i<aa.length; i++){
// aa[i] = sc.nextInt ();
// }
int[] aa= {1 ,2, 3 ,4, 5, 6, 7, 8, 9, 10};
//后移m个位置
System.out.println ("后移m个位置:");
int m = sc.nextInt ();
goBacknm(m,aa);
}
}
运行结果: