
我正在为Google HashCode 2017世界杯决赛做准备,这是Google组织的最大的算法问题竞赛。
我从九年级开始从零开始学习C ++。 我对编程,算法和数据结构一无所知。 在某个时候,我写了第一行代码。 七个月后,正在筹备中的奥运会即将到来。 我想知道我的学习编程风格如何运作。 这是一个理想的机会。
经过两天的比赛,结果是:我获得了金牌。
我感到震惊。 我凭借5年的经验领先于竞争对手。 我知道我努力工作,但是这项成就超出了我的所有期望。 我意识到体育编程是我的主题,并一头扎进去。
我知道是什么导致我成功,并希望与您分享。

本文是在EDISON Software的支持下翻译的,EDISON Software 照顾了程序员的健康和早餐 ,并开发了定制软件 。
选择哪种编程语言
- C ++-强烈推荐! 他非常快。 由于采用了STL,算法的实现只需很少的时间。 所有比赛都接受C ++。 我用C ++写了第一行代码。
- C-由于STL而学习C ++。 如果您了解C,也可以使用C ++进行编程。
- Java是一种慢速编程语言。 它有一个Big Integer类,但是并不能真正帮助您。 如果比赛有时间限制,那么您可能会使用Java超过它。 并非所有竞赛都接受Java。
你在哪里可以练习
我推荐
Sphere Online Judge(SPOJ) 。 就数量和质量而言,它是一种有效的资源。 如果您陷于解决问题的过程中,可以在线获得编辑器和解决方案。 除了此站点之外,我还建议使用
SPOJ工具包和
SPOJ.pl 的问题分类器。首先,您需要磨练基础知识
一旦习惯了该语言的语法,就必须解决一些问题。 从需要练习的简单问题开始。 在此阶段,最主要的是确定您的编程风格。 也许您喜欢编写带有很多空格的代码,也许不是。 也许将括号与“ if”放在同一行,也可以将其放在单独的行上。
您必须找到自己的编程风格,因为它是您的风格。在寻找他时,请不要忘记两个基本原则:
- 您的代码应该易于实现。 您应该轻松实施您想出的解决方案。 怎么了 因为在比赛中,您想要做的最后一件事就是迷失代码。 考虑如何简化代码的实现总是比花10分钟解决它更好。
- 您的代码应易于阅读。 当代码易于阅读时,很容易调试。 面对现实-错误不断出现。 您是否知道当离开终点只有10分钟而找不到该死的错误时的感觉? 当然知道 为避免这种情况,请编写清晰的代码。 当您开始调试它时,代码看起来很自然并且易于理解。
这是我的编程风格
的示例 。
如何提高您的开发技能
再练习,再练习。 我建议您完成
SPOJ上最解决的前250个任务。 按顺序解决它们。 至少花一个小时来思考每个解决方案。
不要说:“这个问题对我来说太复杂了,我将尝试解决以下问题。” 所以失败者认为。
拿一张纸和一支铅笔。 想一想。 也许您可以找到解决方案,也许没有。 至少,您将发展算法思维。 如果您在一小时内无法提出解决方案,请在论坛或文章中查找现成的解决方案。
您将用这种方法实现什么? 了解如何通过代码快速实现您的想法。 并学习经典的问题和算法。
其次,您必须掌握算法和数据结构
遵循分层方法。 您是否开始不走路跑步? 不行 您能在没有坚实基础的情况下建造摩天大楼吗? 再没有。
您不能忽略学习路径中的步骤。 如果您忽略它们,您仍然会存在知识空白。 随着时间的流逝,它们只会恶化。
从基本算法和数据结构开始
很难上手。 也许是因为您不知道先学什么。 因此,
我创建了一个视频课程“算法和数据结构”。 在创建本课程时,我依靠了自己的教学方式。 反应令人难以置信! 第一个月,来自100多个国家/地区的3,000多名学生报名参加了该课程。
如果您致力于解决简单的问题,您将永远不会变得更好。弄清您不知道的内容的最有效方法是在实践中遇到此问题。 所以我学习了。 我选择了一项艰巨的任务,学到了许多以前从未听说过的新技术。
您正在处理的每三个问题都应该教给您一些新知识。 选择问题时要小心。 选择问题比较困难!
在完成SPOJ的这250项任务之后,您将对体育编程的主要主题有一个共识。 由于对基本算法的逻辑有深入的了解,因此高级算法似乎不再那么复杂。 因此,您可以最大程度地利用自己的知识。
深入探讨每个主要主题。
这是一个有价值的资源,其中包含大量信息。 在那里,您将找到每个主题的十大算法和数据结构。 在SPOJ遇到250个问题之后,您将从此列表中了解很多。 但也偶然发现了许多以前从未听说过的东西。 因此,以升序开始探索这些主题。
如果您在学习新知识后不加强自己的知识,那么您会很快忘记一切。
我建议您在学习新算法后,在实践中使用它。 处理2-3个任务。 在SPOJ中查找算法标签。 在那里,您会发现需要该算法的解决方案的问题。 首先对这些问题进行排序。
处理动态编程,因为它将引导您走向胜利
根据我的经验,在每场比赛中至少存在一个
动态编程问题。 许多人在听到“动态编程”一词时会头疼,因为他们根本听不懂。
那很好。 因为如果您了解动态编程,那么您将获胜。
我喜欢动态编程,这是我最喜欢的主题。 动态编程的秘诀是做出全局最优选择,而不仅仅是局部选择。 您必须将问题分解为更简单的子任务。 每个这些子任务仅解决一次。 然后创建一个解决方案,将已解决的子任务组合在一起。
贪婪算法与动态规划相反。 在其中,您需要在每个步骤中做出局部最优的选择。 局部最优的选择会导致较差的整体解决方案。
在探索新概念时,请查看
TopCoder教程 。 它们非常详细且易于理解。 多亏了他们,我才得以理解
二进制索引树 。
努力工作
您是否听说过没有多年实践就赢得奥运会冠军的运动员? 我不知道
每年9月开始进行计算机奥林匹克竞赛,四月结束。
在这8个月中,我每天练习5个小时。
是的,我只花了5个小时来解决算法问题。 我记得我练习8甚至10个小时的日子。 怎么了 因为我喜欢。 每天,放学回家,我直接去卧室,坐在电脑前,开始解决新问题。 或研究了解决该问题所需的新算法。
如果要赢,就必须这样做。 选择一个问题并坚持下去。 在去超市的路上或开车时考虑一下。

您是否知道在睡眠中您的大脑对当天收集的信息进行了碎片整理? 他似乎是按字母顺序在书架上堆放书籍。 本质上,您的大脑会思考您遇到的各种问题。
这可以熟练地使用。 上床睡觉之前,阅读困难的问题并记住需要解决的问题。 此时,您不需要寻找解决方案本身。 上床睡觉 您的大脑将开始处理此问题。 当您醒来时,您会惊讶地发现自己在睡觉时找到了解决方案。
自己尝试。 看起来像魔术。
我创建了一个视频博客

这段简短的段落与体育节目无关。 如果您超过20岁,并且对我如何看待世界感兴趣,那么您可以
在Youtube上观看
我的视频博客 。 我在其中谈到世界,生命和计算机科学。
明智地工作
这是成功的秘诀。 您需要目标。
我们是人,我们喜欢
拖延 。 我们总是想推迟现在需要做的事情。 观看Netflix总是比处理动态节目问题更好。 您知道这一点,需要对其进行修复。
如何克服拖延症
为自己设定目标。 您将始终发现有趣的问题,可以从中学习新知识(查看我上面提到的资源)。 但是这些问题需要解决,而不仅仅是阅读它们。
因此,这就是我克服拖延症的方法。 我开始写纸质日历,每天都想解决我要解决的问题。 我总是提前两天提前填写问题。 因此,我知道接下来几天的时间安排。

因此,我一直有动力。 我需要解决一些问题,并在日历的接下来几天找到新的问题。 消除已解决的问题非常好。 我知道你也喜欢
获取自己的纸质日历。 不要在手机上创建另一个待办事项清单,您明天会忘记。
如何有效登场
想成为专业人士吗? 如果是这样,那么您需要在头脑中贬低。
这是迄今为止我所知道的最有效的调试技术,因为它根本不需要调试器。 与
传统的调试器相比,您的大脑可以同时检查多个代码分支,并为您提供更广泛的代码概览。
您可以将自己与下棋并认为3步领先的大师进行比较。
我仅将此技术用作防御的起点。 然后,我使用一个真正的调试器。
为了学习如何在头脑中贬低,需要实践。 当您批准问题的解决方案并得到“错误答案”时,请勿直接进入调试器按钮。 重新阅读代码,然后思考:“这行会发生什么?”,“如果”会影响程序,那会怎样?”,“退出循环时,迭代器的值是什么?”。
所以你在想自己。 随着时间的流逝,您将学习如何编写代码并在旅途中首次展示它。
关于作者

Andrei Margeloiu是一位狂热的程序员,对企业家精神,创业公司和自然界感兴趣。 您可以
通过LinkedIn与他联系。
翻译:戴安娜·谢列米诺娃(Diana Sheremyova)
另请阅读博客
EDISON公司:
20个图书馆
壮观的iOS应用程序