2026.01.09 编程学习笔记(自用)
一、核心知识点汇总
1. 数组 / 集合基础 - 下标与长度 / 数量
| 类型 | 核心属性 / 方法 | 含义 | 关键规则 | 避坑点 |
|---|---|---|---|---|
| 数组 | length(属性) | 数组元素总数量 | length = 最大下标 + 1(下标从 0 开始) | 访问a[i]需满足0 ≤ i < length;访问a[i+1]需i ≤ length-2 |
| ArrayList | size()(方法) | 集合元素总数量 | size() = 最大下标 + 1 | 方法需加括号(size()而非size);删除末尾元素用remove(size()-1) |
示例:
// 数组示例
int[] a = {1,1,4,5,1,4};
System.out.println(a.length); // 6(元素总数)
System.out.println(a.length-1); // 5(最大合法下标)
// ArrayList示例
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
System.out.println(list.size()); // 2(元素总数)
2. 在线编程页面 Debug 技巧(无 IDE 场景)
核心思路
程序崩溃无输出时,先「防护」(避免直接崩溃),再「分段打印」(崩溃前输出关键信息)。
实操步骤
- 前置基础打印:先打印数组 / 集合的长度、元素,确认输入合法性;
- 循环内防护 + 打印:遍历前判断下标是否越界,逐次打印循环变量、访问的下标;
- 边界提前返回:长度不满足条件时直接返回,避免无效循环。
模板代码:
public int countPeakPoint (int[] a) {
// 1. 基础打印(崩溃前必输出)
System.out.println("数组长度:" + (a == null ? "null" : a.length));
if (a == null || a.length < 3) return 0;
int len = a.length;
int count = 0;
// 2. 循环防护+打印
for (int i = 1; i <= len-2; i++) {
System.out.println("当前i:" + i + ",i+1:" + (i+1)); // 逐次打印
int prev = a[i-1];
int curr = a[i];
int next = a[i+1];
// 业务逻辑
if (prev < curr && curr > next) count++;
if (prev > curr && curr < next) count++;
}
return count;
}
3. 峰点 / 谷点统计逻辑
定义
- 峰点:a[i-1] < a[i] > a[i+1](0 < i < len-1);
- 谷点:a[i-1] > a[i] < a[i+1](0 < i < len-1)。
核心步骤
- 边界处理:数组长度 < 3 时,无峰 / 谷点,直接返回 0;
- 有效遍历区间:i ∈ [1, len-2](保证i-1和i+1都合法);
- 条件判断:峰点 / 谷点满足其一则计数 + 1。
4. 序列操作(ArrayList 实战)
8 种操作映射(核心方法)
| 操作需求 | ArrayList 方法 | 示例代码 |
|---|---|---|
| 末尾加元素 | add(x) | list.add(5); |
| 删除末尾元素 | remove(size()-1) | list.remove(list.size()-1); |
| 查询下标 i 元素 | get(i) | System.out.println(list.get(1)); |
| 下标 i 后插元素 | add(i+1, x) | list.add(2, 10); |
| 升序排序 | Collections.sort(list) | Collections.sort(list); |
| 降序排序 | Collections.sort(list, Collections.reverseOrder()) | Collections.sort(list, Collections.reverseOrder()); |
| 获取长度 | size() | System.out.println(list.size()); |
| 输出序列(空格分隔) | 遍历 + 空格控制 | 见下方示例 |
序列输出示例:
for (int j = 0; j < list.size(); j++) {
if (j > 0) System.out.print(" "); // 非首个元素加空格
System.out.print(list.get(j));
}
System.out.println(); // 换行
5. 浮点数精度处理(直线交点场景)
核心问题
浮点数存储有误差,不能直接用 == 0 判断,需用极小值(EPS)做阈值。
实操代码
final double EPS = 1e-8;
// 判断行列式是否为0(避免浮点数误差)
if (Math.abs(det) < EPS) {
// 直线平行/重合逻辑
}
二、今日踩坑记录
- 数组越界:循环条件写 i < len 导致 i+1 超出最大下标,修正为 i ≤ len-2;
- 空格输出错误:序列输出时 System.out.print("") 改为 System.out.print(" "),保证元素间空格;
- 输入读取异常:多余的 in.nextLine() 导致参数读取失败,直接移除即可;
- 直线插入位置错误:用循环变量 i 代替输入下标,需先读取输入下标再计算插入位置。
三、核心解题思路总结
- 输入处理:先读取基础参数(如操作次数),再按类型分支处理;
- 边界优先:所有数组 / 集合操作先判断边界(长度、下标),避免越界;
- 格式控制:输出序列时,首个元素直接输出,后续元素先加空格再输出;
- Debug 优先:在线环境下,先加打印语句确认输入和关键变量,再写业务逻辑。
四、后续复习重点
- 数组 / 集合下标与长度的对应关系(核心避坑点);
- 在线 Debug 的分段打印技巧(无 IDE 场景必备);
- 浮点数精度处理的阈值选择(1e-8 适配大部分场景);
- 序列操作的空格输出格式(高频考点)。