Exercises02.java 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /**
  2. * @author WanJl
  3. * @version 1.0
  4. * @title Exercises02
  5. * @description 课堂练习02:定义一个整数数组 `{1, 2, 3, 4, 5}`,
  6. * 将数组中的所有元素向右移动 2 个位置。超出数组范围的元素循环移到数组开头(循环右移)。
  7. * @create 2026/7/16
  8. */
  9. public class Exercises02 {
  10. public static void main(String[] args) {
  11. int[] arr={1, 2, 3, 4, 5};
  12. int k= 2; //右移位数
  13. //如果k大于数组长度,要取模
  14. k=k% arr.length;
  15. System.out.print("移动前:");
  16. for (int i = 0; i < arr.length; i++) {
  17. System.out.print(arr[i]+" ");
  18. }
  19. System.out.println();
  20. //整体右移k位(循环右移)
  21. for (int i = 0; i < k; i++) {
  22. //保存最后一个元素
  23. int last=arr[arr.length-1];
  24. //从后往前,每个元素向后移动1位
  25. for (int j = arr.length-1; j>0; j--) { //循环数组长度的轮数
  26. arr[j]=arr[j-1]; //把倒数第2位赋值给最后1位
  27. }
  28. //把最后1位给第0位
  29. arr[0]=last;
  30. }
  31. System.out.print("移动后:");
  32. for (int i = 0; i < arr.length; i++) {
  33. System.out.print(arr[i]+" ");
  34. }
  35. /*
  36. 解题思路过程
  37. 1 2 3 4 5
  38. 先不管移动几位,就只研究 全体向右移动1位。
  39. 1、先把最后一个元素保存起来。
  40. 2、倒数第2位,赋值给倒数第1位。
  41. 3、倒数第3位,赋值给倒数第2位。
  42. 4、倒数第4位,赋值给倒数第3位。
  43. 5、倒数第5位(第1位),赋值给倒数第4位。
  44. 6、把保存起来的最后一个元素,赋值给倒数第5位(第1位)
  45. //保存最后一个元素
  46. int last=arr[arr.length-1];
  47. 整过流程使用循环,就不能是正循环,而是倒着循环, 从 arr[arr.length-1] -> arr[0]
  48. 所以:
  49. for(j=arr.length-1;j>0;j--){
  50. //前一个元素赋值给后一个元素
  51. arr[j]=arr[j-1];
  52. }
  53. 最后,再把最后一个元素,赋值给第1个元素
  54. arr[0]=last;
  55. 现在我们再加上 【数组中的所有元素向右移动 20 个位置】
  56. 定义变量 k 存移动位置
  57. 在刚刚的移动的代码外,增加一个循环
  58. for(int i=0;i<k;i++){ //移动k次
  59. }
  60. 最后,在代码的最初,增加一行,k=k% arr.length;
  61. 要解决的就是,如果k大于数组的长度,会出现重复的不必要的移动。
  62. 比如移动6次,和移动1次,的位置是一样的,
  63. 移动5次,和不移动是一样。
  64. 移动7次,和移动2次是一样的。
  65. */
  66. }
  67. }