牛客网新手入门130_72-77题_20260109

30 阅读3分钟

2026.01.09 编程学习笔记(自用)

一、核心知识点汇总

1. 数组 / 集合基础 - 下标与长度 / 数量

类型核心属性 / 方法含义关键规则避坑点
数组length(属性)数组元素总数量length = 最大下标 + 1(下标从 0 开始)访问a[i]需满足0 ≤ i < length;访问a[i+1]需i ≤ length-2
ArrayListsize()(方法)集合元素总数量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 场景)

核心思路

程序崩溃无输出时,先「防护」(避免直接崩溃),再「分段打印」(崩溃前输出关键信息)。

实操步骤
  1. 前置基础打印:先打印数组 / 集合的长度、元素,确认输入合法性;
  1. 循环内防护 + 打印:遍历前判断下标是否越界,逐次打印循环变量、访问的下标;
  1. 边界提前返回:长度不满足条件时直接返回,避免无效循环。

模板代码

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)。
核心步骤
  1. 边界处理:数组长度 < 3 时,无峰 / 谷点,直接返回 0;
  1. 有效遍历区间:i ∈ [1, len-2](保证i-1和i+1都合法);
  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) {
    // 直线平行/重合逻辑
}

二、今日踩坑记录

  1. 数组越界:循环条件写 i < len 导致 i+1 超出最大下标,修正为 i ≤ len-2;
  1. 空格输出错误:序列输出时 System.out.print("") 改为 System.out.print(" "),保证元素间空格;
  1. 输入读取异常:多余的 in.nextLine() 导致参数读取失败,直接移除即可;
  1. 直线插入位置错误:用循环变量 i 代替输入下标,需先读取输入下标再计算插入位置。

三、核心解题思路总结

  1. 输入处理:先读取基础参数(如操作次数),再按类型分支处理;
  1. 边界优先:所有数组 / 集合操作先判断边界(长度、下标),避免越界;
  1. 格式控制:输出序列时,首个元素直接输出,后续元素先加空格再输出;
  1. Debug 优先:在线环境下,先加打印语句确认输入和关键变量,再写业务逻辑。

四、后续复习重点

  1. 数组 / 集合下标与长度的对应关系(核心避坑点);
  1. 在线 Debug 的分段打印技巧(无 IDE 场景必备);
  1. 浮点数精度处理的阈值选择(1e-8 适配大部分场景);
  1. 序列操作的空格输出格式(高频考点)。