适合初学者的最佳编程挑战:从易到难的编程练习

适合初学者的最佳编程挑战:从易到难的编程练习

有一件事没人会提醒你。你可以连续一个月狂刷教程,对每个视频都点头称是,然后打开一个空白文件却完全不知道该写什么。我经历过。大多数学编程的人都经历过。

解决方法虽然枯燥,但确实有效:自己动手解决小问题,一开始就算做得不好也没关系。所以本指南分为两部分。第一部分是我精心挑选的十个最适合初学者的编程挑战题,难度大致由易到难。第二部分介绍了一些网站,你可以在这些网站上找到成千上万个类似的题目,前提是你得先把这些题目都看完。

任何编程语言都可以。我的例子主要用 Python 和少量 JavaScript,因为大多数人都是从这里入门的。尽量按顺序学习,每个问题都会引入一个新概念。

为什么编程挑战能培养真正的编程技能

什么才算挑战?一些小问题,答案显而易见。“拿一个词,倒着说出来。”“这里有一串数字,哪个最大?” 你不需要安装任何东西,也不需要选择任何框架。你可能只需要写十行代码。

看教程意味着跟随别人的思路。而编程挑战则恰恰相反,它带来的不适感反而很有帮助。你靠猜测,程序出错,你眯着眼睛寻找错误,然后再次尝试。坚持几周,有些事情就会悄然变得容易起来:

  • 语法流畅度提升。再也不用第五次搜索“如何编写for循环”了。
  • 解决问题的能力。在敲击键盘之前,你就会开始将模糊的任务分解成若干步骤。
  • 逻辑思维。一个空列表,一个负整数,一个单字母单词。你会开始期待这些。
  • 调试。红色错误信息不再让人觉得刺眼。
  • 自信。你解决的每一个问题都证明你有能力独立编写程序。

有人曾经跟我说过,编程也有它自己的 80/20 法则,对于初学者来说,这个法则相当准确。大多数问题都离不开那五个基本步骤:循环、if/else 语句、字符串操作、字典计数和数组遍历。只要熟练掌握了这些技巧,很多“新”问题其实只是换了个新面貌的老问题而已。

适合初学者的最佳编程挑战

10 个适合初学者先解决的简单编程挑战

这些方法都不是原创的,而这正是关键所在。它们几乎出现在所有入门课程中,因为它们确实有效。前五个只需要循环、条件语句和少量字符串或列表处理,而后五个则需要你在输入任何代码之前思考使用哪种数据结构。无论如何,即使感觉毫无意义,也尽量在至少二十分钟内不要去搜索。

挑战 1:FizzBuzz

任务是打印 1 到 100 的数字,但每个 3 的倍数都显示为“Fizz”,每个 5 的倍数都显示为“Buzz”,而 3 和 5 的倍数都显示为“FizzBuzz”。

我记得当时觉得它听起来简单得近乎侮辱人。但实际上并非如此简单,这也是为什么面试官们长期以来都喜欢用它的原因。那些读了很多编程书籍但很少动手实践的人,通常会在检查顺序上出错。我的 Python 版本是这样的:

python for n in range(1, 101): if n % 15 == 0: print("FizzBuzz") elif n % 3 == 0: print("Fizz") elif n % 5 == 0: print("Buzz") else: print(n)

如果你的代码运行正常,就把 %15 那一行拖到最下面,运行一下,看看有多少个 FizzBuzz 能存活下来。剧透一下:一个也没有。

挑战 2:反转字符串

输入“hello”,输出“olleh”。

几乎每种语言都有快捷方式,比如 Python 的 `s[::-1]` 或 JavaScript 的 `split("").reverse().join("")`,写一次看看效果也无妨。之后我建议直接删掉它,改用循环一次添加一个字符的枯燥版本。你会发现,大多数语言都不能直接修改字符串,如果没在这里学到这一点,以后很多人会因此感到困惑。

挑战 3:回文棋

回文词是指像“racecar”或“noon”这样的词,正读反读都一样,所以你的函数应该对它们说“是”,对“hello”说“否”。

如果成功了,不妨试试用“一个人,一个计划,一条运河:巴拿马”来提升你的编程技能。这段文字只有在全部转换为小写并去掉空格和标点符号后才能通过。你可以直接用上次挑战中编写的字符串反转代码,感觉很不错。

挑战 4:斐波那契数列

你可能以前见过这个数列:0, 1, 1, 2, 3, 5, 8, 13,其中每个数字都是它前面两个数字之和。你的函数应该返回其中的前 n 个数字。

两个变量和一个循环就足够了。有趣的是,当你用递归重写它时,函数会调用自身,然后请求 n = 35。在大多数笔记本电脑上,你会等待一段时间,而弄清楚为什么会这样,就相当于对动态规划的一次初步探索。这是那种“哦,原来如此”的顿悟时刻,却会深深地印在你的脑海里。

挑战 5:旋转数组

取一个数组和一个数字 k,然后将每个元素向右移动 k 位,末尾的元素循环到数组的前面。对于 [1, 2, 3, 4, 5] 和 k = 2,你应该得到 [4, 5, 1, 2, 3]。

大多数初次尝试都会在 k 大于列表时失败。将五个元素旋转 7 倍实际上只是将它们旋转 2 倍,这一点一旦你看到就很明显,否则是看不见的。

如果你顺利完成了前五个挑战,没遇到太多困难,那就很棒了。接下来的挑战对你的要求会更高一些。

挑战 6:找出数组中的最大整数

如果可以使用 max() 函数,找到最大值很容易,但你不能这么做。改用循环,然后找到第二大值,这样就不用遍历列表两次了。现在你需要跟踪两个值,因此必须小心地决定先更新哪个值。

重复数字和负数是很好的测试对象,因为很多早期解决方案在处理它们时都会悄悄失败。

挑战7:数句子中的元音字母

数元音字母是热身活动。真正的练习是分别数每个元音字母,并返回类似 {"a": 3, "e": 5, "i": 1, "o": 2, "u": 0} 的结果。

对于很多初学者来说,这是字典(或 JavaScript 中的对象)最终变得有意义的时刻,这很重要,因为它可能是你在接下来的一年中最依赖的数据结构。

挑战 8:字谜检查器

字谜是指使用完全相同的字母但顺序不同的词,例如“listen”和“silent”,所以你要编写一个函数来判断两个字符串是否符合字谜的条件。

我知道有两种合理的方法。你可以对两个字符串进行排序并比较结果,或者你可以统计每个字母出现的次数并比较这些次数。把两种方法都写出来,然后思考哪种方法更省力,这基本上就是你思考效率问题的第一步。

挑战9:二和

对于列表 [2, 7, 11, 15] 和目标值 9,返回加起来等于目标值的两个数字的位置,这里是 [0, 1]。

大多数人一开始会使用两个嵌套循环来遍历所有数字对,这对于短列表来说还可以,但很快就会变得很慢。更快捷的方法是将已经遇到的数字保存在一个字典中,这样就可以立即查找它们。LeetCode 将这种方法放在首位并非偶然,因为它清晰地展示了正确的数据结构有多么重要。

挑战10:猜数字游戏

在这里,电脑会随机抽取一个 1 到 100 之间的秘密数字,你不断猜测,它会告诉你“太大”或“太小”,直到你猜对为止,还会告诉你你尝试了多少次。

与其说这是一个简单的编程谜题,不如说它更像是一个小型应用程序,包含用户输入、while 循环和随机数。总会有人输入“banana”(香蕉)而不是数字,所以你还得处理错误输入。与其他谜题不同的是,这个谜题你可以把它交给朋友一起玩。

最佳在线编程挑战网站

我的十个挑战用完之后,你会想要一个无限量供应且带有自动检查功能的平台。这些在线编程挑战网站都具备这种功能,只是使用起来感觉很不一样。

平台最适合格式成本
埃达比特绝对初学者浏览器中的小型编程挑战免费套餐
Codewars游戏化练习社区解决方案排名“kata”自由的
运动养成良好习惯语言课程(可选配人工导师)自由的
免费代码营结构化学习课程包含练习和认证自由的
HackerRank技能培训和就业准备基于主题并带有难度标签的问题免费供学习者使用
LeetCode面试准备算法题(难度:简单/中等/困难)免费套餐
CodeChef迈向比赛练习路线加定期比赛免费套餐
欧拉计划数学爱好者数学难度高的谜题,仅提交答案自由的
代码的出现季节性乐趣每年十二月推出以故事为主题的每日谜题自由的

埃达比特

如果朋友问我从哪里开始,我会推荐 Edabit。题目都很短,所有程序都在浏览器中运行,还能获得经验值。Edabit 涵盖了 Python、JavaScript、Java、C++ 等多种语言,而且“非常简单”的标签是真的非常简单。

Codewars

Codewars 将其题目称为“kata”(武术术语,意为练习)。题目难度从最简单的 8 级到 1 级不等。神奇之处在于提交之后。你可以看到其他所有人的答案,将你笨拙的十行代码与别人简洁流畅的两行代码并列比较,比大多数教程都更有启发性。

运动

Exercism 是一个非营利性项目,完全免费。它涵盖超过 80 种编程语言,如果你需要,还有志愿者导师可以帮你检查代码。你可以直接在浏览器中使用,也可以将练习下载到自己的电脑上。我建议你最终选择后者,因为它能让你熟悉 Visual Studio Code 和终端的使用。

免费代码营

严格来说,它并非一个挑战网站。它是一套完整的课程体系,由数百个小型编程练习组成,因此也符合挑战的定义。如果你喜欢结构化的学习,它非常适合你:涵盖 JavaScript、Python、响应式网页设计等内容,每个学习路径结束时都有认证项目。

HackerRank

HackerRank 将问题按技能类别(Python、SQL、数据结构、算法)进行分类,并显示每个问题的难度以及已解答人数。许多公司会用它来筛选候选人。现在熟悉一下界面,以后就能省去不少麻烦。

LeetCode

这里是面试准备的天堂。题目分为简单、中等和困难三个等级,即使是“简单”的题目也假定你已经掌握了基础知识。我建议你把这些编程挑战当作一个前进的方向,而不是起点。等我感觉自己已经掌握了十分钟的编程技巧,再回来吧。

CodeChef

CodeChef 最初是一个竞技编程网站。如今,除了常规比赛之外,它还提供初学者练习路径,所以如果你觉得限时比赛很有趣,这里是一个不错的尝试之地。

欧拉计划

需要编写代码才能破解的数学题。网站上没有编辑器。你可以随意编写程序,只需输入最终结果即可。数学爱好者会非常喜欢它。其他人则往往不感兴趣。

代码的出现

每年十二月,你都会收到一个由两部分组成的谜题,中间穿插着一个滑稽的故事。活动最近从25天缩短到12天,并且取消了全球排行榜,所以现在主要是和朋友或同事们一起玩私人排行榜。之前的谜题会全年保留,谜题库也是一个绝佳的练习素材库。

你还会听到 Coderbyte 的名字,它将挑战与面试课程结合起来;以及 Topcoder,它实际上是为经验丰富的开发人员准备的。

友情提示:许多较早的题目列表仍然指向 Google Code Jam 和 Kick Start。Google 已于 2023 年关闭了这两个平台,现在只剩下题目存档。

适合初学者的最佳编程挑战

如何练习编程挑战而不至于精疲力竭

收藏十个网站并不能让你变得更好,养成习惯才能。以下是我大致的做法:

  1. 选择一种编程语言并坚持下去。Python通常是首选,因为它读起来几乎像英语。如果你想开发网站,JavaScript 是个不错的选择。
  2. 安装一个真正的代码编辑器。第一周用浏览器编辑器就行了。尽早安装 Visual Studio Code 可以让你学会运行文件、在终端中查看错误信息以及使用调试器。
  3. 每天解决一到三个问题。每天少量多次的编程练习胜过周日六小时的突击学习。练习间隙,模式会逐渐形成,而且小目标也不容易被忽略。
  4. 完成之后,不妨看看其他解决方案。在 Codewars 或 Exercism 上,找两三个其他答案看看。你会从中学习到最佳实践和一些真正值得借鉴的巧妙技巧。
  5. 重温旧题。一周后,凭记忆重新做一道题。如果做不出来,说明你只是死记硬背,而不是真正理解了。
  6. 先从小型项目入手。做大约 30 到 50 个问题,然后开发一些东西:比如待办事项清单、基于免费 API 的天气应用、文字冒险游戏。这时,不同的技能就开始相互协作了。

当你在编程挑战中遇到困难时该怎么办

你肯定会遇到难题。资深开发人员甚至在午饭前都会遇到难题。他们有一套解决难题的常规方法,所以不妨借鉴一下:

  • 用你自己的话重述问题。很多“我解决不了这个问题”的情况,其实都是“我理解错了”。
  • 手动完成一个例子。只需少量输入、笔和纸,并将你采取的每个步骤都记录下来。恭喜,这就是你的算法。
  • 先写伪代码。 “对于每个数字,如果它大于当前最大值,则保留它。” 简单的英语比代码更容易修改。
  • 把所有数据都打印出来。大多数 bug 都是因为某个变量的值与你的预期不符。打印出来看看吧。
  • 大声解释。一行一行地讲解你的代码,对着人或者对着橡皮鸭都可以。软件错误往往会在句子说到一半的时候就显现出来。
  • 分步骤使用提示。许多平台会在给出完整答案之前提供提示。先采纳提示,然后再继续尝试。

无论如何,千万不要照搬别人的解决方案,然后看着它通过审核就走开。我之前就这么做过一段时间,结果一无所获。如果你真的看了某个答案,关掉标签页,等一个小时,然后自己重新构建一遍。

面向区块链初学者的加密主题代码挑战

也许你最初想学习编程的原因是加密货币支付或区块链。那么就从解决相关领域的问题入手。虽然基础知识相同(字符串、整数、API),但任务更贴近实际技术工作。你不需要理解共识算法。

  • 获取实时币价。调用一个免费的公开加密货币价格 API,打印当前比特币价格,每分钟刷新一次。Hello,HTTP 请求和 JSON。
  • 验证钱包地址格式。检查字符串是否像一个合理的地址:长度正确、前缀正确、仅包含允许的字符。这是很好的字符串练习,也是正则表达式的入门。
  • 构建一个单位转换器。将聪 (Satoshi) 转换为比特币 (BTC)(1 BTC = 100,000,000 聪),将韦 (wei) 转换为以太坊 (ETH)(1 ETH = 10¹⁸ wei)。你会很快发现为什么浮点数和货币不兼容,以及为什么开发者要将金额保持为整数。
  • 使用 SHA-256 算法对字符串进行哈希处理。用标准库对句子进行哈希处理,然后更改一个字母,再次进行哈希处理。结果完全不同。这种特性是区块链得以维系的关键所在。
  • 创建一个简单的结账页面。该页面包含一个“使用加密货币支付”按钮,点击该按钮可通过支付网关 API 生成测试发票。

最后一点将其他所有步骤串联起来:表单、API 调用、错误处理以及向真实用户展示结果。像Plisio这样的网关会发布 API 和文档,您可以将其集成到模拟商店中,这使得初学者练习看起来非常像真正的电子商务集成。

今天就从一个编程问题开始你的编程练习吧!

回想当初我刚开始编程时遇到的瓶颈,真正让我突破的并非什么传说中的难题。对初学者来说,最好的编程挑战反而是那些看似枯燥乏味的小问题,我通常是在深夜,一边喝着冷茶一边在电脑旁苦苦钻研,最终才得以完成。

所以今晚就打开编辑器,让 FizzBuzz 运行起来,哪怕代码再丑也没关系。趁着现在还觉得有趣,继续往下看我的列表,等到觉得没意思了,就换成表格里看起来最友好的网站。把这个习惯养成到让你觉得跳过它有点傻的地步。一个月后,有些网站你会觉得几乎无聊透顶,而这种无聊感,其实就是真正掌握编程技能后内心的真实感受。

任何问题?

说实话?FizzBuzz 也跟其他程序一样。它只需要一个循环和几个 if 语句,你甚至可以一口气解释清楚,但很多人第一次尝试时还是会把检查顺序搞错。反转字符串是个不错的第二步。

我会推荐 Edabit 给完全的初学者,主要是因为题目比较短,而且不需要安装任何东西。Codewars 的排名系统和可以查看所有人答案的功能,会让初学者上瘾。Exercism 提供免费导师,这很难得。freeCodeCamp 适合喜欢按部就班学习的人。LeetCode 可以先放一放,因为即使是简单题也默认你已经掌握了基础知识。

我个人认为Python对大多数人来说更好,部分原因是它的语法简洁明了,让你能够专注于逻辑而不是括号和分号。如果你已经确定要开发网站,那么JavaScript也是不错的选择,因为几乎所有浏览器都能运行它。两者在编程挑战中都适用,而且说实话,坚持下去比选择哪种语言本身更重要。

每天一到三道题,我的意思是,对于新手来说,这应该是一个上限,而不是目标。每天做两道题,坚持一个月,比一个周末塞三十道题来得更有收获。我会利用剩下的时间,真正理解每道题的解法,并研究其他人是如何解决的。

说来也怪,问题本身虽然从未变得更简单,但确实如此。变化的是,你会开始注意到一些相同的模式反复出现,比如循环、条件语句、字符串处理、使用字典计数以及遍历数组。大约做到第四十道题的时候,你会突然意识到“哦,又是这些”,这就是转变的开始。

首先用你自己的话重述问题,因为根据我的经验,大约一半的“卡住”时刻其实都是理解错误造成的。纸笔也很有帮助。手动解决一个简单的例子,写下你的解题步骤,这份清单就成了你的伪代码。打印语句可以让你清楚地看到变量的实际值。如果二三十分钟过去了仍然没有思路,一个提示是可以的,但直接给出完整答案通常是不行的。

Ready to Get Started?

Create an account and start accepting payments – no contracts or KYC required. Or, contact us to design a custom package for your business.

Make first step

Always know what you pay

Integrated per-transaction pricing with no hidden fees

Start your integration

Set up Plisio swiftly in just 10 minutes.