freeCodeCamp 每日一题 Challenge 32:用一行链式调用实现 Reverse Sentence 字符串倒序
【免费下载链接】freeCodeCampfreeCodeCamp.org's open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp
本篇指南基于 freeCodeCamp 课程仓库中的每日一题文件 Challenge 32: Reverse Sentence 展开,完整解读这道 JavaScript 字符串处理题的任务规则、四组断言用例、参考种子代码与官方解法,并深入剖析split(/\s+/).reverse().join(" ")这一核心链式调用的工作原理与易错点。读完后,你能独立写出通过全部测试用例的实现,并理解这道题在 freeCodeCamp 每日编程挑战体系中的定位。
任务规则与测试用例
题目文件位于 daily-coding-challenges-javascript 目录,其原始描述为:
Given a string of words, return a new string with the words in reverse order. For example, the first word should be at the end of the returned string, and the last word should be at the beginning of the returned string.
即:给定一个由若干单词组成的字符串,返回一个新字符串,其中单词顺序被整体颠倒——原来第一个单词放到末尾,最后一个单词放到开头。题目附加了两条关键约束:
- 输入字符串中,单词之间可以由一个或多个空格分隔;
- 返回字符串中,单词之间只允许有一个空格。
这两条约束直接决定了实现不能简单依赖split(" ")(按单个空格切分会产生空字符串项),必须用正则\s+匹配"一个或多个空白符"。
题目提供了四组assert.equal断言作为验收标准:
assert.equal(reverseSentence("world hello"), "hello world");assert.equal(reverseSentence("push commit git"), "git commit push");assert.equal(reverseSentence("npm install apt sudo"), "sudo apt install npm");assert.equal(reverseSentence("import default function export"), "export function default import");前两组是常规情形:单词间只有单空格,直接倒序即可。后两组是重点考察对象——输入中存在连续多个空格(如"npm install apt sudo"中install后有 3 个空格、apt后有 4 个空格),输出必须把这些不规则空白"归一化"为单词间单个空格。如果实现只做了倒序而没处理空白归一化,这两组用例会直接失败。
参考实现与逐环节解析
题目自带的种子代码(seed)是一个未完成的函数骨架,要求你补全reverseSentence(sentence)的函数体:
function reverseSentence(sentence) { return sentence; }文件末尾给出的官方解法只有一行:
function reverseSentence(sentence) { return sentence.split(/\s+/).reverse().join(" "); }下面逐环节拆解这行链式调用:
1.split(/\s+/):按"一个或多个空白符"切分
正则\s匹配空白字符(空格、制表符、换行等),量词+表示一个或多个。因此/\s+/会把任意长度的连续空白视为同一个分隔符,切分结果是一个干净的单词数组,不含空字符串项:
"world hello".split(/\s+/)→["world", "hello"]"npm install apt sudo".split(/\s+/)→["npm", "install", "apt", "sudo"]
这正是满足"输入可由一个或多个空格分隔"约束的关键一步。
2.reverse():原地颠倒数组顺序
Array.prototype.reverse()将数组元素原地反转并返回同一数组引用。上一步的数组["npm", "install", "apt", "sudo"]反转后变为["sudo", "apt", "install", "npm"]。注意它反转的是"单词的顺序",而不是每个单词内部的字符——题目要求的是词序颠倒,字符序保持不变。
3.join(" "):用单个空格重新拼接
join(" ")以单个空格为连接符将数组合并为字符串。这一步天然满足了"返回字符串中单词间只有一个空格"的第二条约束——无论输入端有多少个连续空格,输出端都只保留一个。
三个环节合起来,恰好与题目两条约束一一对应,这也是该解法能以最短代码通过全部四组断言的原因。
常见错误写法与辨析
结合测试用例,可以归纳出两种典型错误实现:
// 错误 1:按单空格切分 function reverseSentence(sentence) { return sentence.split(" ").reverse().join(" "); }split(" ")会在连续空格处产生空字符串项:"a b".split(" ")得到["a", "", "b"]。反转后拼接会产生"b a"这类保留了多余空格的输出(甚至夹带前导/尾随空格),无法通过后两组断言。
// 错误 2:只归一化空白,忘了倒序 function reverseSentence(sentence) { return sentence.split(/\s+/).join(" "); }这种写法只完成了空白归一化,词序保持原样,前两组断言即会失败。
此外还有一个值得注意的边界情形:当输入以空白开头或结尾时,split(/\s+/)会返回以(或尾随)空字符串开头的数组,例如" hello".split(/\s+/)→["", "hello"]。由于本道每日题的测试用例均为普通单词序列,官方解法未显式处理该情形即可全部通过;若在通用场景中复用这段代码,可以补一句filter(Boolean)剔除空项:
function reverseSentence(sentence) { return sentence.split(/\s+/).filter(Boolean).reverse().join(" "); }这道题在仓库中的组织方式
从文件结构看,该挑战由三部分组成,均以 题目 Markdown 文件 为单元:
- frontmatter 元数据:
id(68af0687ef34c76c28ffa54b)、title(Challenge 32: Reverse Sentence)、challengeType: 28、dashedName。其中challengeType: 28的含义可以从 challenge-types.ts 得到确认:const dailyChallengeJs = 28,即"JavaScript 每日编程挑战"类型(对应地,dailyChallengePy = 29是 Python 每日题类型)。 # --hints--区:即上文四组assert.equal断言,是题目页面的提示内容,也是判分依据。# --seed--/# --solutions--区:分别存放学员看到的种子代码与可展示的参考解答。
挑战的排序与归属则定义在 daily-coding-challenges-javascript.json 中:该 block 的dashedName为daily-coding-challenges-javascript,challengeOrder数组里按id精确登记了每一题,Challenge 32 的条目即为{"id": "68af0687ef34c76c28ffa54b", "title": "Challenge 32: Reverse Sentence"},紧邻前一篇 Challenge 31: Array Diff 与后一篇 Challenge 33。
在运行时侧,按日期取题的公开接口由 daily-coding-challenge.ts 中的路由实现(/daily-coding-challenge/today、/daily-coding-challenge/date/:date等),从数据库按"美国中部时间当日零点"查询对应挑战;挑战的提交与判分仍走主 API 的常规挑战完成路由,这一点在该路由文件的头部注释中有明确说明。
小结
Reverse Sentence 看似只是"把单词顺序反过来",但两条约束把它变成了一个考察正则空白切分与数组链式调用的微型实战题:split(/\s+/)负责把不规则空白归一为分隔符,reverse()负责颠倒词序,join(" ")负责输出端的标准间距。掌握这条split → reverse → join链后,同类"按空白分词 + 重排 + 标准化拼接"的需求(如去重、过滤、按长度排序单词)都可以在此基础上直接套用。
【免费下载链接】freeCodeCampfreeCodeCamp.org's open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考