每当做编程题目时,大多数人都会靠基本的直觉,遵循一些固定的步骤来有效地解题。不管是有意还是无意,在做编程题目的时你会下意识地遵循一些步骤,在阅读完这篇文章后你就可以将这些步骤和这篇文章联系起来,从而就可以更高效地解题。

因此在这篇文章中,我将讨论解编程题的五个步骤。



作者 | Madhav Bahl



译者 | 弯月

责编 | 屠敏

出品 | CSDN(ID:CSDNNews)






这个世界需要的是开发者,我为什么要在编程竞赛上花时间呢?





我自己就是开发,但我发现大多数开发者(包括许多“非常”有能力的开发者)并不是太擅长做数据结构、算法以及一些通用的问题。很可悲的是,许多人只不过是通过遵循一些基本的步骤来开发应用程序,或者做一些非常简单的软件,然后称自己为“程序员”。



这个时代人人都能编程,所以深入学习数据结构和算法不再是当今学生们的第一选择,即使是那些本应非常重视这些领域的学生。

即使是我,作为一个开发者,也没有参加过太多编程竞赛,但我还是会尽量在算法和数据结构上多花些时间,学习如何编写高效的代码,并鼓励和推荐所有人都关注这个方面。

下面是一些例子,表明数据结构、算法和编程竞赛(一般意义上的)的内容能帮助学生们:

*
选择好的大学

*
编写高质量的代码

*
编写高效率的代码(时间和空间复杂度)

*
最优地使用资源

*
逻辑推理

*
知名度(编程竞赛的学生可以接触到巨大的社区)

*
机遇(大量的编程竞赛)

*
编程的过程有无限的乐趣

“编程教你怎样面对大问题。”——Jack Dorsey

现在进入正题。






做编程题时的五个步骤





几天前在做一道编程题时,我发现我在解题时都会遵循一个固定的模式。我又做了几道题,并写下了解题前后我脑海中的步骤。很惊讶的是我发现竟然真的有规律可循,我甚至都不知道我用了五个步骤,但有了这五个步骤,我就能更高效地解题了。

正如我前面说过的,很可能你也会下意识地使用这些步骤,但如果你进行总结,并意识地使用后,就会发现惊人的区别。

1.理解并分析问题

阅读题目,开始思考题目,可能的话在纸上写下给出的条件和你需要找出的条件。

问自己几个问题:

*
能完全理解题目吗?

*
能给非专业人士解释清楚问题吗?

*
需要多少输入,每个输入都是什么?

*
每个输入带来的输出是什么?

*
能从题目中分解出几个模块吗?

*
是否拥有足够的信息?如果没有,试着再理解一遍题目。



2.仔细阅读示例输入

仔细阅读示例输入,试着想出更多的示例输入,这样能帮你更好地理解题目,而且,这样能让你想清楚你的代码需要处理多少种情况,可能的输出或输出范围是什么。

这里我建议:

*
选择非常简单的输入并找出输出

*
选择更复杂、更大的输入,看看输出是什么,需要多少种用例

然后开始处理边界条件:

*
不提供任何输入,输出应该是什么

*
提供非法输入,输出应该是什么



3.分解题目

对于大型问题来说这一步非常非常有帮助。这种情况下我建议遵循以下步骤:

*
试着手绘一份流程图或 UML

*
将问题分解成模块,或子问题

*
试着为每个子问题建立独立的功能

*
按顺序或按需要调用子问题(很可能一个函数会调用另一个函数),将它们连接起来

*
如果是真实世界的问题(如管理系统等),试着用类和对象来实现



4.开始解题和写代码

现在题目已经分析完,可以真正编写代码了。如果不能一次性解完,那么可以先给一个简单的部分写代码,随着解决问题的深入,你会逐步发现更多细节,从而找出更多的思路。

只需要记住这三点,就一定能找到解法:

*
你的起点

*
你的位置

*
你的目标



而且,如果你是在面试中,不要浪费时间去解决整个题目再告诉面试官,应该不断简化问题,不断告诉面试官你解决问题的方法。

*
告诉面试官你从哪里入手

*
告诉他你在思考什么方法

*
找出你在问题中面临的最难的部分

*
有时可以忽略“最难”的部分,从简单的子问题入手,这样能给你带来更多的时间去思考前者

*
解决完简单的子问题后,试着用类似的方式解决困难的部分

*
解题时可能会想出更好的方法,要告诉面试官

5.回顾并学习

这部分是最重要的!解题完成后,一定要回顾下:代码能否改进?有没有另一种解题的方法?



不要做完就放弃了!这样等于放弃你找出其他解法的可能性,也放弃了完整地探索问题的机会!

下面是在写完代码之后应该问自己的问题:

*
这段代码是否能处理任何输入(包括边界情况)?

*
有没有其他方法解决问题?

*
代码是否有效?能否更有效?

*
代码是否可读?

*
如果别人给你这段代码,你能否理解?

*
性能能否提高?

*
能否利用其他算法达到更好的结果?

除了这些问题之外,还要检查同一题目其他人的解答,看看别人是怎样完成的,这个过程中你会学到很多。






总结




本文讨论了以下五个步骤:

*
分析并理解问题

*
仔细阅读示例输入和用例

*
将问题分解成子问题,或函数,或模块

*
开始解题和编程

*
解题完成后,回顾代码是否可以改进,是否有其他解题方法

以上,希望这篇文章可以提高你的解题技巧。 

原文:https://hackernoon.com/how-to-approach-any-coding-problem-9230f3ad6f9

本文为 CSDN 翻译,如需转载,请注明来源出处。

 热 文 推 荐 

极客头条 <https://blog.csdn.net/csdnnews/article/details/86673564>

直击平昌!2天40位大咖的平昌区块链论坛精华都在这了!
<https://blog.csdn.net/csdnnews/article/details/86710258>

☞ 开源软件的中年危机如何破解?
<http://mp.weixin.qq.com/s?__biz=MjM5MjAwODM4MA==&mid=2650713311&idx=3&sn=48005ecb8efe738b5a9adb01f08d889a&chksm=bea6dd0c89d1541a4ad7dc9efdd55a8c831dd998b0dd563fc31b2a51975804f6f400c54d904d&scene=21#wechat_redirect>

孟岩:区块链的原则与价值观 <https://blog.csdn.net/Blockchain_lemon/article/details/86697880>


☞Spring-Data-JPA尝鲜:快速搭建CRUD+分页后台实例
<https://mp.weixin.qq.com/s?__biz=MzA3MjY1MTQwNQ==&mid=2649825867&idx=2&sn=20773fcae73e2185b937b16f82a1d75b&chksm=871e85a9b0690cbf573cb45b4f4a92d44a1dfd5f337680a33aa029f90fca15d138ce6b35e2d5&scene=21&token=887723808&lang=zh_CN#wechat_redirect>

☞她说:是的,嫁人当嫁程序员!

有赞公开强推 996 制,员工:已拨打市长电话
<https://blog.csdn.net/csdnsevenn/article/details/86698005>

Python一键转Java?“Google翻译”你别闹
<https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/86697889>

print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!\n");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"
喜欢就点击“好看”吧!

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信