发布于 2026-01-06 0 阅读
0

编程挑战:不仅仅是脑筋急转弯 引言:当你只有一把锤子和一个模式时 你的思维工具箱

编程挑战:不仅仅是脑筋急转弯

引言:当你只有一把锤子的时候

模式

今天

你的思维工具带

引言:当你只有一把锤子的时候

“当你只有一把锤子时,所有东西看起来都像钉子。” 这句话被称为“工具法则”或“马斯洛之锤”(还有其他一些名称)。它的含义是,有时我们会对某种工具感到熟悉或习惯,并倾向于用它来解决问题。这篇文章讲述的是我最近的一次经历:我放弃了手中的一把锤子,并在我的思维工具箱中添加了新的工具。

我在学习初期就放弃了编程,转而从事运维方面的工作。很快我就发现,我所学习的工具和系统处理问题的能力参差不齐。MySQL 并非总是最佳数据库。即使 Nginx 能够实现负载均衡,它也并非最佳负载均衡器。仅仅因为我能写出 1000 行的 bash 脚本,并不意味着我就应该这么做。

最终,我不得不不断学习解决问题的新方法。我订阅了各种博客,观看在线发布的会议演讲,在 Twitter 上关注工程领域的领军人物,甚至放弃了 Perl(这大约是 8 年前的事了 :) )。

我最近又开始专注于我的编程技能,但在谈论这一点之前,先让我回顾一下我十几岁时第一次开始编程的时候。

模式

给定一个表示迷宫的 mxn 二维数组,返回一个表示迷宫解的索引列表。

作为一个17岁的Java编程新手,我被难住了。每次运行测试,都会出现“ArrayIndexOutOfBoundsException”或者“错误:返回的解决方案没有条目”之类的错误。我气得对着键盘猛砸,还骂了几句脏话……最后放弃了。

那是一段不太愉快的经历,但我印象最深的是,另一位程序员向我展示了他如何用一个大小相同的二维布尔数组来标记他走过的路径,从而追踪他去过的地方。我觉得这是有史以来最绝妙的解决方案。显然,那时我很少出门,但这就像一道闪电击中了我的大脑。我清楚地记得他说:“有时候,用一个单独的结构来追踪信息会更方便。” 注意,他说的是“有时候”,而不是“总是”,因为当时我并没有意识到这一点。

我很快发现,在其他编程挑战中,维护另一个用于跟踪“已访问”项的结构非常有用。我第一次运用这种方法是在编写一个程序来查找Boggle 游戏板上的单词时。确实很方便!但它并非总是有效,有时甚至会使问题变得更难。

今天

快进到今天……我很高兴地说,我现在又开始学习编程技能了!我喜欢创造!

我目前在Hackrank上花费大量时间解决各种编程挑战,并阅读相关的讨论,了解其他人是如何解决我正在处理的问题的(这实际上是我最喜欢这些挑战的原因之一)。

周期检测

剧透警告——我在这里详细讲解了如何解决 HackerRank 的一道挑战。

链表循环

最近,我遇到了一个挑战,促使我写了这篇文章:“循环检测”。这个挑战要求你检测单链表中的循环。我知道这个模式!我只需要维护一个单独的结构,记录我访问过的节点,如果经过其中一个节点,就检测出是否存在循环。

幸运的是,我研究的这些问题中出现的各种极端情况,让我的大脑开始运转起来。解决方案似乎有些不对劲。它并没有错,但如果我的链表有一百万个节点呢?如果节点更多呢?有没有其他方法可以解决这个问题?

提交我的解决方案后,我翻到“讨论”部分,在那里我大开眼界,并对其他人简洁而优雅的解决方案垂涎不已。

他们只是用了另一个指针,遍历链表的速度是原来的两倍。如果第一个指针和第二个指针指向同一个位置,那么链表就会陷入循环。这方法很巧妙,而且比我的方案简单得多!

还有哪些地方可能会出现碰撞类型的问题?也许我只是发现了一种新的模式……我随手把它记在了我的思维工具箱里。思考这个解决方案以及这两种技术如何在网络(以及其他领域)中应用时,我感到很有意思。

你的思维工具带

学习基础知识本身就很有趣。更棒的是,当你开始将各种基础知识联系起来,并看到更宏观的图景时,你会觉得很有意思。学习不同的问题解决方法能让你掌握更多知识,并让你超越简单的“锤子”——或者更确切地说,它能帮助你判断什么时候“锤子”才是解决问题的正确工具。

让你我不断进步的关键在于学习如何解决问题,以及学习新的解决方法!即使是看似简单的事情也不例外。即便我们能力不断提升,积累了更多专业知识,也应该放下固有的偏见(就像用锤子敲打自己),去探索其他解决问题的方法。

你除了锤子以外还有其他工具吗?你是不是觉得钉子太多了?那就继续磨练技艺,尝试新事物,探索新领域,读一本书,读一篇 dev.to 的文章——无论做什么……都要不断学习!

文章来源:https://dev.to/_morgan_adams_/programming-challenges-more-than-just-brain-teasers-mi1