
时间如飞,但这 100 天值得铭记。
还记得第一次打开力扣,映入眼帘的是陌生的代码和一堆看不懂的算法题目。那时的我,马上要踏入大学的生活,刚开始接触计算机科学与技术专业,连「数组」、「哈希」这些概念都一知半解,更别提什么“动态规划”或者“图算法”。
但是,我告诉自己,总要开始的。
那时候,我甚至不敢想象自己能够完成这么多题目,更别提理解背后的逻辑与原理。但现在,当我看着这张题型分布图——那一片片灰绿相间的圆圈,我知道,这 100 天的坚持,没有白费。

100 天前的我,面对算法这个陌生的世界,根据学校的百题斩选择了从最基础的题目开始,一步步迈向前方。那时的我,没有掌握复杂的数据结构,也不懂动态规划,但我知道,只要开始,总会有所收获。
力扣平台入门:
为了稳扎稳打,我选择了力扣百题斩的入门题型,解决了像最小公倍数、公因子的数目、将数字变成 0 的操作次数这类问题。这些简单题目让我逐渐理解了条件判断、循环与基本逻辑的应用,也让我更加熟练地写出正确的代码。
数字的进制转换与基础计算:
然后我做了关于整数操作和数字统计的题目:
统计各个位的数字之和、各位相加,让我学会了如何灵活运用「取余与除法」分解数字。
反转两次的数字和回文数,帮助我理解了数字操作与逻辑判断的结合。
从这些简单却扎实的题目中,我得到了莫大的成就感,也为后续深入学习打下了坚实的基础。
这是我们学校的百题斩 很适合新手从基础开始,这里面的题值得多做几遍,反复推敲。
在算法学习的道路上,二维数组是我遇到的第一道坎。刚开始接触时,面对密密麻麻的数字和坐标,我常常感到混乱,分不清行与列,甚至写错循环的嵌套顺序。但我不甘心就此放弃,决定一遍遍啃透它,直到彻底搞明白。
迷茫与突破
起初的挑战:
最早的题目,比如矩阵对角线元素的和,明明只是简单的遍历,我却常常出错。到底是 matrix[i][j] 还是 matrix[j][i]?
一道小题让我理解了:二维数组是一个坐标系,行是第一个维度,列是第二个维度。逐渐地,我不再害怕它。
突破的关键:
随着练习深入,我做了像删除每行中的最大值和判断矩阵是否为 X 矩阵这类题目。我学会了:
先用嵌套循环处理每个元素,掌握遍历的行、列顺序;
然后根据题意,巧妙地添加判断逻辑,确保代码高效准确。
我还记得有一天,我花了整整一个小时,终于写出了一道可以形成最大正方形的矩形数目的题解。当运行代码通过时,此刻二维数组的世界并不复杂,只要掌握规则和思路,就能将复杂问题逐一拆解。
回望当初,我想说:
二维数组让我走过了一段痛苦却充实的旅程。从混乱到清晰,从出错到精准,每一个代码调试的瞬间,都让我更接近真正的掌握。如今,当我面对新的二维数组题目时,我已经不再恐惧,因为我知道:我有能力把它们一一击破!
当班主任布置下这个任务时,我心里既期待又忐忑。动态数组和单链表,是我学习编程路上的“陌生地带”。尽管概念听起来并不复杂,但实现它们的每一行代码,都对我现有的编程思维提出了全新的挑战。现在回过头看,我真的很感谢这段充满探索的日子,它让我从迷茫逐步走向了自信。
刚开始接触动态数组时,我对它的概念仅停留在“可变容量的数组”上,完全没有意识到它背后复杂的内存管理逻辑。当代码开始实现时,我第一次感受到什么叫做“看似简单,其实并不容易”。
第一次突破:动态扩容的实现
动态数组的核心是内存的动态管理,这需要用到 malloc 和 realloc 函数。我花了一节课的时间理解为什么扩容需要两倍的大小,为什么旧指针在扩容后可能会失效,以及如何用 realloc 处理这些细节。当我亲手写出以下代码并成功运行时,那种成就感真的难以用语言形容:
if (*numsCountPtr == *numsSizePtr) {
int *temp = (int *)realloc(*numsPtr, (*numsSizePtr * 2) * sizeof(int));
if (temp == NULL) {
perror("realloc failed");
exit(EXIT_FAILURE);
}
*numsPtr = temp;
*numsSizePtr *= 2;
}这一瞬间,我深刻理解了动态数组的“动态”二字,意识到内存管理并不是编译器帮你完成的事情,而是需要程序员亲手去掌控。
第二次突破:从删除到缩容的设计
动态数组的删除功能不仅要调整元素的位置,还需要对多余的空间进行内存释放。我尝试了很多种方式,最终在 realloc 中找到了答案。当代码在执行删除操作后自动调整容量时,我心里暗暗觉得:我真的在编程的世界里前进了一步。
灵活的多功能实现
从插入、删除,到排序、反序,动态数组的每一个功能都让我感受到了数据结构的魅力。例如,当我完成了 nums_reverse 函数后,看到数组在控制台中以倒序输出时,我第一次体会到代码真的可以“听话”。这种成就感,让我对编程的兴趣又加深了一分。
相比动态数组,单链表的实现对我来说是更大的挑战。它要求我掌握指针的操作逻辑,而这一点对当时的我来说,简直是一片未踏足的荒野。
最初的挣扎:节点与指针的迷宫
当我第一次实现节点创建函数时,我花了半天时间才明白为什么 malloc 分配的内存需要初始化,以及为什么需要用指针维护节点之间的连接。像这样的代码:
struct slist_node *slist_node_create() {
struct slist_node *node = (struct slist_node *)malloc(sizeof(*node));
if (node == NULL) {
perror("malloc failed");
exit(EXIT_FAILURE);
}
node->data = -1;
node->next = NULL;
return node;
}虽然只有短短几行,但每一行的意义我都反复推敲了很多次。这让我意识到,链表的灵活性和复杂性,全部体现在指针的管理上。
头插法与尾插法:一步步理清逻辑
在实现 slist_add_first 和 slist_add_last 时,我第一次体会到“调试”的重要性。尤其是尾插法,当程序死循环时,我用了很久才发现是自己忘记更新尾节点的指针。最终,当链表能够正常插入数据时,那种突破的快感让我对自己产生了信心。
反转链表:逻辑的优雅之处
反转链表是班主任特别强调的一个功能,当我完成以下代码时,我不由得感叹链表的灵活性:
void slist_reverse(struct slist_node **headPtr) {
struct slist_node *newHead = NULL;
while (*headPtr != NULL) {
struct slist_node *node = *headPtr;
*headPtr = node->next;
node->next = newHead;
newHead = node;
}
*headPtr = newHead;
}每次调试成功的瞬间,屏幕上的输出都像是在对我说:“你做到了。”
排序链表:复杂但值得的挑战
排序链表对我来说,是整个任务中最复杂的一部分。实现从头到尾的节点遍历、插入和链接维护,仿佛让我走了一遍“数据结构的迷宫”。最终,当链表能够按照大小顺序输出时,我觉得自己的努力得到了最大的回报。
通过完成动态数组和单链表的任务,我不仅掌握了两个重要的数据结构,更学会了如何冷静地面对复杂问题,如何耐心地解决一个又一个错误。每一次“程序崩溃”,都让我对代码多了一分敬畏;每一次“调试成功”,都让我对自己多了一分信心。
在这100天我也深刻意识到:过度依赖题解和AI,不仅会让自己丧失思考的机会,还可能错过学习和成长的过程。作为一名计算机专业的学生,我逐渐明白,编程不仅是写代码,更是一个不断摸索和思考的过程。
刚开始面对任务时,我习惯性地去查题解,从中直接找到解决方案。然而,现实却告诉我:题解并不是万能的,它们只能提供参考,而无法替代真正的思考。每个人的代码实现都有差异,直接套用别人的思路往往适得其反,甚至让我更加迷茫。
现在的AI工具非常强大,尤其是在排错和调试方面,能够快速帮助我们解决许多编程问题。过度依赖AI排错,会让自己失去深入理解问题的机会。
犯错是学习的必经之路
每当程序报错时,我一开始总是习惯性地把错误贴到AI工具中,希望能得到快速的解决方案。然而,这样的便利让我忽视了思考错误原因的重要性。后来,我尝试自己分析错误,通过阅读报错信息、对比代码逻辑,定位问题所在。虽然这样耗时更长,但每次亲自找到问题的根源时,我都感觉自己向前迈进了一步。
用AI,但不依赖AI
AI是一个很好的辅助工具,但它只能给出建议,而无法取代程序员的思考。
100天,我明白了:编程是一门需要耐心和思考的艺术,而不是单纯的“工具应用”。以下是我从中得到的一些体会:
从最初的 0 道题,到现在的这些圆圈分布,每一个绿色的部分,都是我用时间和汗水换来的。
我学会了坚持:哪怕被一道题卡住几个小时,我也会告诉自己,再试一遍,再想一想。
我学会了思考:每做完一道题,我都会总结它的核心思想,思考有没有更优的解法。
回顾这段日子,我感到无比充实。从一开始的懵懂,到后来一点点攻克每一个细节,我不再只是“写代码”,而是学会了如何用代码去解决问题,如何通过思考突破瓶颈。我明白了,编程不仅是一门技术,更是一种思维方式——它教会我如何面对复杂问题,如何冷静分析,如何一步步走向解决方案。
这一过程中,我也经历了迷茫与挣扎。曾经,我对题解抱有太多依赖,对AI工具寄予过多期待,但最终,我意识到真正的成长只有通过亲自经历和深入思考才能获得。每一次调试的挫折、每一次代码的崩溃、每一次小小的成功,都在不断塑造一个更坚韧、更理性的自己。
绕远路才是最短的捷径,烂命一条,学就完了
特别感谢我的学长和班主任是他们带领我理解了代码的细节与逻辑,让我从对c语言的陌生,到能够独立实现每一个功能。他们的关怀和鼓励,不仅让我在学习中找到方向,更让我体会到了他们对我的深厚期待和用心栽培。
这段时间让我明白:学习的路上从来不是孤单的,有贵人的指点和同行者的陪伴,我才能一步步走向更高的目标。我将永远铭记这些关心与帮助,也会将它们化作动力,继续向前!