| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- /**
- * @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次是一样的。
- */
- }
- }
|