算法刷题和蓝桥杯备赛复盘:从基础题到工程思维

写在前面

大学里我花过一段时间刷算法题,也准备过蓝桥杯。现在回头看,这段经历最大的价值不一定是比赛结果,而是让我更早训练了拆问题、写边界、调试代码和控制复杂度的能力。

这篇文章不写夸张的竞赛经历,只复盘我当时怎么学习算法,以及这些训练对后端开发有什么帮助。

为什么开始刷题

最开始刷算法题,是因为发现自己写代码时很容易卡在基础逻辑上。

比如:

  • 循环边界经常写错
  • 数组下标容易越界
  • 遇到复杂一点的题不知道怎么拆
  • 代码能跑,但可读性很差

刷题的过程让我慢慢意识到,算法训练不是只为了比赛,也是在训练基本编程能力。

我的学习顺序

一开始我没有直接看很难的题,而是按基础内容慢慢来:

  1. 数组和字符串
  2. 排序和二分
  3. 前缀和与差分
  4. 双指针
  5. 栈和队列
  6. BFS / DFS
  7. 简单动态规划
  8. 贪心和模拟

这个顺序对我比较友好。先把常见题型熟悉起来,再逐步看复杂一点的思路。

蓝桥杯备赛时的感受

蓝桥杯题目比较适合训练基础算法和代码实现能力。备赛时我主要做了三件事:

  • 刷历年真题
  • 整理常用模板
  • 复盘自己错在哪里

我印象比较深的是,有些题并不是不会算法,而是实现细节出错。例如输入格式没处理好、边界条件漏掉、数据范围没看清楚。

这类问题看起来低级,但在真实开发里也很常见。接口参数、分页边界、空值判断,本质上也需要类似的严谨性。

常用模板整理

备赛时我会整理一些基础模板,比如二分、前缀和、DFS。

二分查找:

1
2
3
4
5
6
7
8
9
10
11
12
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;

前缀和:

1
2
3
4
5
6
int[] prefix = new int[n + 1];
for (int i = 1; i <= n; i++) {
prefix[i] = prefix[i - 1] + nums[i - 1];
}

int sum = prefix[r + 1] - prefix[l];

模板不是为了死背,而是为了在遇到类似问题时快速进入状态。

刷题对后端开发的帮助

后来做后端项目时,我发现算法训练对工程开发也有帮助。

边界意识

刷题经常要处理空数组、重复元素、最大值、最小值。写接口时也一样,要考虑参数为空、数据不存在、分页越界等情况。

拆问题能力

复杂题目不能一口气写完,需要拆成子问题。后端需求也是一样,要拆成表结构、接口、业务逻辑、异常处理和联调步骤。

调试习惯

算法题错了以后,需要用样例一步步跟变量。排查接口 Bug 时,也需要看入参、日志、SQL 和返回结果。

复杂度意识

算法里会关注时间复杂度和空间复杂度。后端里虽然不一定天天写算法,但 SQL 查询、循环处理、批量数据,都需要有复杂度意识。

现在怎么看算法

我现在不会把自己包装成竞赛选手,也不会说算法能力特别强。更真实的说法是:算法刷题帮我补了编程基本功,也让我在写业务代码时更注意边界和效率。

对 Java 后端来说,算法不是唯一重点,但它确实能体现一个人的基础思维能力。

小结

这段算法学习和蓝桥杯备赛经历,对我最大的帮助是:

  • 提升代码实现能力
  • 增强边界判断意识
  • 训练问题拆解能力
  • 养成复盘错误的习惯

这些能力后来也迁移到了后端学习里。相比强调比赛成绩,我更愿意把它当成一段基础能力训练的经历。


算法刷题和蓝桥杯备赛复盘:从基础题到工程思维
https://zxyblog.top/2024/05/20/算法刷题和蓝桥杯备赛复盘/
作者
zxy
发布于
2024年5月20日
许可协议