/**
 * @author WanJl
 * @version 1.0
 * @title Exercises02
 * @description  课堂练习02：定义一个整数数组 `{1, 2, 3, 4, 5}`，
 * 将数组中的所有元素向右移动 2 个位置。超出数组范围的元素循环移到数组开头（循环右移）。
 * @create 2026/7/16
 */
public class Exercises02 {
    public static void main(String[] args) {
        int[] arr={1, 2, 3, 4, 5};
        int k= 2; //右移位数
        //如果k大于数组长度，要取模
        k=k% arr.length;

        System.out.print("移动前：");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.println();
        //整体右移k位（循环右移）
        for (int i = 0; i < k; i++) {
            //保存最后一个元素
            int last=arr[arr.length-1];
            //从后往前，每个元素向后移动1位
            for (int j = arr.length-1; j>0; j--) {  //循环数组长度的轮数
                arr[j]=arr[j-1];    //把倒数第2位赋值给最后1位
            }
            //把最后1位给第0位
            arr[0]=last;
        }
        System.out.print("移动后：");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }

        /*
            解题思路过程
            1   2   3   4   5

            先不管移动几位，就只研究 全体向右移动1位。

            1、先把最后一个元素保存起来。
            2、倒数第2位，赋值给倒数第1位。
            3、倒数第3位，赋值给倒数第2位。
            4、倒数第4位，赋值给倒数第3位。
            5、倒数第5位(第1位)，赋值给倒数第4位。
            6、把保存起来的最后一个元素，赋值给倒数第5位(第1位)

            //保存最后一个元素
            int last=arr[arr.length-1];

            整过流程使用循环，就不能是正循环，而是倒着循环， 从 arr[arr.length-1] -> arr[0]
            所以：
            for(j=arr.length-1;j>0;j--){
                //前一个元素赋值给后一个元素
                arr[j]=arr[j-1];
            }
            最后，再把最后一个元素，赋值给第1个元素
            arr[0]=last;


            现在我们再加上 【数组中的所有元素向右移动 20 个位置】
            定义变量 k 存移动位置
            在刚刚的移动的代码外，增加一个循环
            for(int i=0;i<k;i++){   //移动k次

            }

            最后，在代码的最初，增加一行，k=k% arr.length;
            要解决的就是，如果k大于数组的长度，会出现重复的不必要的移动。
            比如移动6次，和移动1次，的位置是一样的，
            移动5次，和不移动是一样。
            移动7次，和移动2次是一样的。

         */



    }
}
