|
|
@@ -19,9 +19,44 @@
|
|
|
|
|
|
> **提示**:可以用变量交换的经典三步法 `temp = a; a = b; b = temp;`。
|
|
|
|
|
|
----
|
|
|
+**参考代码**:
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @title 练习1:数组元素首尾交换
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class Practice01 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ int[] arr = {10, 20, 30, 40, 50};
|
|
|
+
|
|
|
+ // 输出交换前的数组
|
|
|
+ System.out.print("交换前:");
|
|
|
+ for (int i = 0; i < arr.length; i++) {
|
|
|
+ System.out.print(arr[i] + " ");
|
|
|
+ }
|
|
|
+ System.out.println();
|
|
|
+
|
|
|
+ // 首尾对称交换:第1位↔第5位,第2位↔第4位
|
|
|
+ // 即 arr[0]↔arr[4], arr[1]↔arr[3]
|
|
|
+ int temp = arr[0];
|
|
|
+ arr[0] = arr[4];
|
|
|
+ arr[4] = temp;
|
|
|
+
|
|
|
+ temp = arr[1];
|
|
|
+ arr[1] = arr[3];
|
|
|
+ arr[3] = temp;
|
|
|
+
|
|
|
+ // 输出交换后的数组
|
|
|
+ System.out.print("交换后:");
|
|
|
+ for (int i = 0; i < arr.length; i++) {
|
|
|
+ System.out.print(arr[i] + " ");
|
|
|
+ }
|
|
|
+ System.out.println();
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
|
|
|
-### 练习 2:数组元素循环右移
|
|
|
+---### 练习 2:数组元素循环右移
|
|
|
|
|
|
**难度**:⭐⭐⭐
|
|
|
**知识点**:数组操作、循环、下标运算
|
|
|
@@ -39,6 +74,49 @@
|
|
|
- 移动位数用一个变量 `k = 2` 控制
|
|
|
- 思考:如果 k 大于数组长度怎么办?(提示:`k = k % 数组长度`)
|
|
|
|
|
|
+**参考代码**:
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @title 练习2:数组元素循环右移
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class Practice02 {
|
|
|
+ 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];
|
|
|
+ // 从后往前,每个元素往后移一位
|
|
|
+ for (int j = arr.length - 1; j > 0; j--) {
|
|
|
+ arr[j] = arr[j - 1];
|
|
|
+ }
|
|
|
+ // 把最后一个元素放到第一位
|
|
|
+ arr[0] = last;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 输出移动后的数组
|
|
|
+ System.out.print("右移" + k + "位后:");
|
|
|
+ for (int i = 0; i < arr.length; i++) {
|
|
|
+ System.out.print(arr[i] + " ");
|
|
|
+ }
|
|
|
+ System.out.println();
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
---
|
|
|
|
|
|
### 练习 3:数组去重
|
|
|
@@ -63,8 +141,68 @@
|
|
|
- 可以先统计不重复元素的个数,再创建新数组
|
|
|
- 或者创建一个足够大的新数组,遍历原数组判断是否已存在
|
|
|
|
|
|
----
|
|
|
+**参考代码**:
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @title 练习3:数组去重
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class Practice03 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ int[] arr = {5, 2, 8, 2, 5, 9, 1, 8, 3};
|
|
|
+
|
|
|
+ // 输出原数组
|
|
|
+ System.out.print("原数组:");
|
|
|
+ for (int i = 0; i < arr.length; i++) {
|
|
|
+ System.out.print(arr[i] + " ");
|
|
|
+ }
|
|
|
+ System.out.println();
|
|
|
+
|
|
|
+ // 第一步:统计不重复元素的个数
|
|
|
+ int count = 0; // 不重复元素的个数
|
|
|
+ for (int i = 0; i < arr.length; i++) {
|
|
|
+ boolean isRepeat = false;
|
|
|
+ // 检查 arr[i] 在它之前是否出现过
|
|
|
+ for (int j = 0; j < i; j++) {
|
|
|
+ if (arr[i] == arr[j]) {
|
|
|
+ isRepeat = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!isRepeat) {
|
|
|
+ count++; // 不重复,计数+1
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 第二步:创建新数组,存放不重复的元素
|
|
|
+ int[] newArr = new int[count];
|
|
|
+ int index = 0; // 新数组的当前索引
|
|
|
+ for (int i = 0; i < arr.length; i++) {
|
|
|
+ boolean isRepeat = false;
|
|
|
+ // 检查 arr[i] 是否已放入新数组
|
|
|
+ for (int j = 0; j < i; j++) {
|
|
|
+ if (arr[i] == arr[j]) {
|
|
|
+ isRepeat = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!isRepeat) {
|
|
|
+ newArr[index] = arr[i];
|
|
|
+ index++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 输出去重后的数组
|
|
|
+ System.out.print("去重后:");
|
|
|
+ for (int i = 0; i < newArr.length; i++) {
|
|
|
+ System.out.print(newArr[i] + " ");
|
|
|
+ }
|
|
|
+ System.out.println();
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
|
|
|
+---
|
|
|
### 练习 4:双色球号码生成器
|
|
|
|
|
|
**难度**:⭐⭐⭐⭐
|
|
|
@@ -93,9 +231,63 @@
|
|
|
int num = (int)(Math.random() * 33) + 1;
|
|
|
```
|
|
|
|
|
|
----
|
|
|
+**参考代码**:
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @title 练习4:双色球号码生成器
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class Practice04 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ int[] redBalls = new int[6]; // 红球数组,6个号码
|
|
|
+ int blueBall; // 蓝球号码
|
|
|
+
|
|
|
+ // 生成红球号码(6个不重复的 1~33)
|
|
|
+ int index = 0; // 已生成的红球个数
|
|
|
+ while (index < 6) {
|
|
|
+ // 生成一个候选号码
|
|
|
+ int num = (int)(Math.random() * 33) + 1;
|
|
|
+
|
|
|
+ // 检查是否已存在(去重)
|
|
|
+ boolean isRepeat = false;
|
|
|
+ for (int i = 0; i < index; i++) {
|
|
|
+ if (redBalls[i] == num) {
|
|
|
+ isRepeat = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 不重复则加入数组
|
|
|
+ if (!isRepeat) {
|
|
|
+ redBalls[index] = num;
|
|
|
+ index++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 生成蓝球号码(1个 1~16)
|
|
|
+ blueBall = (int)(Math.random() * 16) + 1;
|
|
|
+
|
|
|
+ // 输出结果
|
|
|
+ System.out.print("红球号码:");
|
|
|
+ for (int i = 0; i < redBalls.length; i++) {
|
|
|
+ // 个位数补0输出,如 05
|
|
|
+ if (redBalls[i] < 10) {
|
|
|
+ System.out.print("0");
|
|
|
+ }
|
|
|
+ System.out.print(redBalls[i] + " ");
|
|
|
+ }
|
|
|
+ System.out.println();
|
|
|
+
|
|
|
+ System.out.print("蓝球号码:");
|
|
|
+ if (blueBall < 10) {
|
|
|
+ System.out.print("0");
|
|
|
+ }
|
|
|
+ System.out.println(blueBall);
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
|
|
|
-### 练习 5:基本类型 vs 引用类型(代码分析)
|
|
|
+---### 练习 5:基本类型 vs 引用类型(代码分析)
|
|
|
|
|
|
**难度**:⭐⭐
|
|
|
**知识点**:基本数据类型 vs 引用数据类型
|
|
|
@@ -120,6 +312,50 @@ public class ThinkDemo {
|
|
|
|
|
|
请问以上代码的运行结果是什么?为什么 `arr1[0]` 的值会被改变?结合课堂笔记中"基本数据类型 vs 引用数据类型"的知识,在注释中写出你的分析。
|
|
|
|
|
|
+**参考代码**:
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @title 练习5:基本类型 vs 引用类型
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class Practice05 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ /*
|
|
|
+ 问题分析:
|
|
|
+
|
|
|
+ ① int a = 10; int b = a;
|
|
|
+ 基本数据类型赋值,b 复制了 a 的值 10,两者独立。
|
|
|
+ 之后 b = 20,只改变 b,a 不受影响。
|
|
|
+ 所以 a = 10,b = 20。
|
|
|
+
|
|
|
+ ② int[] arr1 = {1, 2, 3}; int[] arr2 = arr1;
|
|
|
+ 引用数据类型赋值,arr2 复制的是 arr1 的地址值,
|
|
|
+ 两者指向堆内存中的同一个数组对象。
|
|
|
+ 所以 arr2[0] = 999 修改的是它们共同指向的数组,
|
|
|
+ arr1[0] 自然也跟着变成了 999。
|
|
|
+
|
|
|
+ 结论:
|
|
|
+ 基本数据类型存的是"值"本身,赋值时各玩各的。
|
|
|
+ 引用数据类型存的是"地址值",赋值时多个引用指向同一块内存。
|
|
|
+ */
|
|
|
+
|
|
|
+ // ===== 基本数据类型测试 =====
|
|
|
+ int a = 10;
|
|
|
+ int b = a; // b 复制 a 的值
|
|
|
+ b = 20; // 只改变 b
|
|
|
+ System.out.println("a = " + a); // 10(a 不受影响)
|
|
|
+ System.out.println("b = " + b); // 20
|
|
|
+
|
|
|
+ // ===== 引用数据类型测试 =====
|
|
|
+ int[] arr1 = {1, 2, 3};
|
|
|
+ int[] arr2 = arr1; // arr2 复制 arr1 的地址值
|
|
|
+ arr2[0] = 999; // 通过 arr2 修改数组
|
|
|
+ System.out.println("arr1[0] = " + arr1[0]); // 999(arr1 也变了!)
|
|
|
+ System.out.println("arr2[0] = " + arr2[0]); // 999
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
---
|
|
|
|
|
|
> **参考笔记**:[20260715-笔记.md](../课堂笔记/01-JavaSE基础-笔记/20260715-笔记.md) 第三章「数组(Array)」
|