今天参加了法国最佳程序员(Meilleur Dev de France, 简称MDF)比赛,结果第一轮就被淘汰了,有些失望。赛前两个月做了不少的LeetCode算法题,还把去年的初赛和决赛的题目都做了一遍,结果还是卡在了初赛第二题上,最终无缘决赛。
MDF的比赛,主要比的是算法和速度的结合,需要在赛前选择一种语言, 且比赛过程中不能更改。这次我选用的是JavaScript (Node.js),因为平时开发前端比较多。而且和Java/C#/C++等语言相比,JavaScript更加灵活,语法更精简一些,有利于快速实现 (另外一个用的比较多的语言是Python)。比赛分为初赛和复赛,每轮40分钟做三道题,题目难度循序渐进。今年初赛一共分了6个小组,每组大概200人,取前40名最快的。
静下心来想想,这次失利有如下几个原因:
首先,比赛过程中有些着急,心态不是很好。由于之前准备的还算充分,所以目标至少是进决赛。比赛开始之前还有个小插曲,提前20分钟进场,就一直连不上比赛页面,在开关wifi无数次再加上重启电脑之后,才在最后1分钟打开了页面。比赛过程中有些着急,过于追求速度,犯了很多小错误,调试花了很多时间。
其次,也是最大的问题,就是还没有完全理解清楚题意,就开始编写程序了,导致越走越偏。MDF的比赛,速度很关键,但是找到正确的算法更关键,而算法正确的前提,是题目要理解正确。但是这次,我在没有看懂给出的示例的情况下,就开始先入为主的揣测题目考察的目的和算法,把问题搞得很复杂。在有35分钟的情况下,没有做完一道相对简单的题目。同样的问题,在做去年的题目时也出现过,但是没有引起足够的重视,没有拿出一个可以执行的避免这种问题的方案。比赛是和别人竞争,但更多的是挑战自己的过程,要发现自己性格习惯和知识上的弱点,并有针对性的改善,才是参加这类比赛的最终目的。
最后,比赛过程中也体现出了对JavaScript的一些常用API还不是很熟悉,比如 includes/substr/splice/map/reduce等方法的使用还没有做到烂熟于心。另外,比赛技巧上也需要提高,如果拿不准某一个细节,与其花很多的时间揣测,不如先快速实现出来,提交看看结果对不对。
总而言之,过程比结果重要,最为第一次参加这种比赛,学到了不少东西:熟悉语言,平和心态,理解题目(和示例),注重细节。打铁还需自身硬,算法的提高是一个长期努力的结果,要时刻保持思维的活跃和敏捷,提高算法知识的深度和广度。 我们明年再战!