尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

freeCodeCamp 每日编程挑战解析:用 Python 实现 Longest Word(最长单词查找)

freeCodeCamp 每日编程挑战解析:用 Python 实现 Longest Word(最长单词查找) freeCodeCamp 每日编程挑战解析用 Python 实现 Longest Word最长单词查找【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCampfreeCodeCamp 开源仓库中内置了一套「每日编程挑战Daily Coding Challenge」体系其中 Challenge 50: Longest Word 是一道典型的 Python 字符串处理题目给定一个句子返回其中长度最长的单词忽略句点.对标点遇到长度并列时返回最先出现的那个。本文将以此题为骨架完整还原题目要求、三个判定用例、种子代码与官方参考答案并深入到 freeCodeCamp 仓库的源码与配置中说明这类题目在课程体系中的定位、测试执行机制与前端运行环境帮助你既会做题、也看懂背后的工程实现。题目全景Challenge 50: Longest Word本题对应的挑战文件位于 curriculum/challenges/english/blocks/daily-coding-challenges-python/68b7cadffed0e75a517da66f.md文件头部的元数据清晰地定义了这道题的身份字段值说明id68b7cadffed0e75a517da66f挑战的唯一 ID全仓库全局唯一titleChallenge 50: Longest Word题目名称challengeType29挑战类型编号对应 Python 每日挑战dashedNamechallenge-50URL 友好的短名称其中challengeType: 29是关键在 packages/shared/src/config/challenge-types.ts 中29被定义为dailyChallengePy即「Python 每日编程挑战」专属类型。同一个 blockdaily-coding-challenges-python中 200 道题目共用此类型配套的 JavaScript 版本则使用28dailyChallengeJs。从源码结构可以推断这类题目在课程树中统一归入「Daily Coding Challenge」入口由 curriculum/structure/blocks/daily-coding-challenges-python.json 按challengeOrder数组维护顺序——本挑战id68b7cadffed0e75a517da66f正是列表中的第 50 项。需求拆解两个边界规则题目本身只给出两句话的要求但浓缩了两个极易被忽略的边界规则Given a sentence, return the longest word in the sentence.—— 核心目标返回句子中最长的单词。Ignore periods (.) when determining word length.—— 计算长度时忽略句点.也就是说句子末尾的句号不能算作单词长度的一部分。If multiple words are ties for the longest, return the first one that occurs.—— 出现多个同样长度的单词时必须返回最先出现的那一个即“第一胜出”规则而不是“最后一个胜出”。第二、三条规则直接决定了参考答案的写法官方解法中先用sentence.split()按空白拆词这样educational.会被拆成带句点的educational.再用str.replace(., )去掉句点后比较长度并且比较时使用严格大于而非大于等于从而保证并列时保留更早出现的单词。判定用例Hints逐条解读仓库文件中的--hints--部分是题目的自动化测试全部通过runPython在浏览器端执行 Python 代码并用 Python 标准库unittest的TestCase().assertEqual做断言。三个用例完整如下用例一get_longest_word(coding is fun)应返回coding。({test: () { runPython( from unittest import TestCase TestCase().assertEqual(get_longest_word(coding is fun), coding)) }})三个单词coding6 字符、is2 字符、fun3 字符中coding最长且唯一返回coding。用例二get_longest_word(Coding challenges are fun and educational.)应返回educational。({test: () { runPython( from unittest import TestCase TestCase().assertEqual(get_longest_word(Coding challenges are fun and educational.), educational)) }})这是最核心的用例educational.字面上是 12 个字符但按规则忽略句点后是 11 个字符若实现时直接用原始字符串比长度会把句点计入导致返回educational.或比较出错。官方实现先replace(., )再比长度恰好保证返回去掉句点的educational。用例三get_longest_word(This sentence has multiple long words.)应返回sentence。({test: () { runPython( from unittest import TestCase TestCase().assertEqual(get_longest_word(This sentence has multiple long words.), sentence)) }})此用例同时考验“忽略句点”和“并列取先”两条规则multiple与sentence均为 8 字符但sentence在句子中出现得更早因此正确答案是sentence而不是multiple。若比较逻辑使用则会错误地返回multiple。种子代码与解题起点题目在--seed-contents--中给定了函数骨架学习者只需填充函数体def get_longest_word(sentence): return sentence可以看出默认实现是直接原样返回输入的sentence字符串这显然无法通过任何用例——这正是挑战的起点学习者需要自己完成「拆词 → 清洗标点 → 遍历比较 → 返回最长项」的完整逻辑。官方参考答案逐行剖析--solutions--段提供了官方的完整解法def get_longest_word(sentence): words sentence.split() longest for word in words: clean_word word.replace(., ) if len(clean_word) len(longest): longest clean_word return longest逐行拆解其设计意图行代码作用与要点1words sentence.split()默认按任意空白字符空格、制表符、换行切分句子为单词列表句点仍附着在最后一个单词上2longest 初始化最长单词为空字符串保证任何非空单词的长度≥1都能覆盖它3for word in words:顺序遍历天然保证“先出现的单词优先被记录”4clean_word word.replace(., )去除该单词中的所有句点实现“忽略句点”规则5if len(clean_word) len(longest):严格大于才更新并列时保留先出现的单词6longest clean_word注意这里保存的是清洗后的单词不带句点与用例二期望的输出一致7return longest返回结果该解法的时间复杂度为 O(n·m)n 为单词数m 为平均单词长度空间复杂度 O(n)。replace(., )会移除单词内所有句点如缩写e.g.会被处理成eg在本题目给定用例下不影响正确性。变体与扩展从官方解到通用解官方解法足够简洁但了解变体有助于真正吃透“并列取先”与“忽略标点”这两个核心规则写法一key参数 max等长取先需谨慎def get_longest_word(sentence): words [w.replace(., ) for w in sentence.split()] return max(words, keylen)max在遇到相同key值时返回列表中最先出现的项因此天然满足“并列取先”规则。但注意若用keylambda w: len(w)且在比较前未清洗句点则会在用例二上失败。写法二显式清洗 线性扫描语义最清晰def get_longest_word(sentence): longest for word in sentence.split(): clean word.strip(.,!?;:) if len(clean) len(longest): longest clean return longest把strip(.,!?;:)视作对“忽略句点”规则的泛化——题目只要求忽略.但把规则扩展到常见句末标点也不需要改动循环结构这体现了该题解法的可扩展性。关于并列取先的深层原因if len(clean_word) len(longest)使用严格大于意味着后一个同长度单词永远不会覆盖前一个这正是「return the first one that occurs」的代码级体现。这也是本类题最常被忽视的考点。工程视角这类题目在 freeCodeCamp 中如何运转理解了题目本身后值得回到仓库源码看看challengeType: 29是如何被整个体系识别和驱动的。挑战类型的注册与分发packages/shared/src/config/challenge-types.ts 是类型的“总注册表”const dailyChallengePy 29;第 31 行定义了类型编号viewTypes中将dailyChallengePy映射为classic视图第 135 行意味着本题与经典代码挑战共用同一套编辑器界面submitTypes中映射为tests第 176 行即提交后通过运行测试来判定对错getIsDailyCodingChallenge(challengeType)第 187 行通过dailyCodingChallengeTypes列表识别「每日挑战」类型含 JS 与 Python 两种getDailyCodingChallengeLanguage(challengeType)第 204 行将dailyChallengePy映射为python用于确定运行语言。因此当学习者在前端进入本题时系统会走「classic 编辑器 Python 语言 tests 提交」这一组合管线。测试如何被执行为 Python 断言本题的--hints--使用了runPython(...)包裹的unittest断言这在 e2e 测试中有直接对应物e2e/daily-coding-challenge.spec.ts 中构造的 mock 挑战数据python.tests[0].testString就是一个({test: () { runPython(\assert True True)}})形式第 41 行说明该格式是每日挑战 Python 测试的标准载体。从仓库结构可以推断这类测试在前端通过内置的 Python 运行时浏览器内执行运行与项目自带的 Python 课程如pythonProject、pyLab 等类型共用同一套执行机制。每日挑战的入口与路由在课程地图与落地页上每日挑战有独立的入口组件client/src/components/daily-coding-challenge/widget.tsx 渲染「今天的挑战」与「历史归档」两个按钮分别指向/learn/daily-coding-challenge/${getMonthDayUsCentral()}与/learn/daily-coding-challenge/archive。日期计算依赖 client/src/components/daily-coding-challenge/helpers.ts 中的getTodayUsCentral()——基于美国中部时区America/Chicago计算“今天”并对 2 月 29 日做特殊映射toMonthDay将02-29转为02-28确保每年的同一天都对应同一道题。Challenge 50 这类题即通过「按月-日归档」的方式被收录进每日挑战体系。在课程树中的定位curriculum/structure/blocks/daily-coding-challenges-python.json 以challengeOrder数组维护了全部 Python 每日挑战的顺序本挑战id68b7cadffed0e75a517da66f排在第 50 位前后分别是Challenge 49: CSV Header Parser与Challenge 51: Phone Number Formatter。文件头还声明了usesMultifileEditor: true与helpCategory: Python前者表示题目支持多文件编辑器本题虽只有一个函数但环境按多文件模式加载后者将题目归入 Python 帮助分类用于学习社区的问题归类。本地体验如何运行与验证仓库采用 pnpm workspace 管理见根目录 package.json 与 pnpm-workspace.yaml。如果你想在本地复现本题或亲手验证解法可以按以下方式操作仅验证算法逻辑直接把官方解法粘贴到任意 Python 3 环境运行三个用例等价于from unittest import TestCase def get_longest_word(sentence): words sentence.split() longest for word in words: clean_word word.replace(., ) if len(clean_word) len(longest): longest clean_word return longest tc TestCase() tc.assertEqual(get_longest_word(coding is fun), coding) tc.assertEqual(get_longest_word(Coding challenges are fun and educational.), educational) tc.assertEqual(get_longest_word(This sentence has multiple long words.), sentence) print(All assertions passed)完整运行 freeCodeCamp 前端与课程环境参考仓库根目录 README.md 的指引安装依赖并启动开发服务器即可在浏览器中进入每日挑战页面实际编写并提交代码题目的判定逻辑由上文提到的 hints 测试驱动无需额外配置。小结Challenge 50: Longest Word 虽是一道入门级字符串题但它完整覆盖了「切分 → 清洗 → 比较 → 保持首次出现」四个典型处理步骤其官方实现更是将「忽略句点」与「并列取先」两条边界规则体现得淋漓尽致。通过阅读其挑战元数据challengeType: 29、共享配置challenge-types.ts、组件入口widget.tsx与 e2e 用例daily-coding-challenge.spec.ts你不仅能独立 AC 这道题还能理解 freeCodeCamp 每日编程挑战从题目文件到前端运行、再到自动化断言的完整工程链路为继续研究该开源项目的课程体系打下基础。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表