freeCodeCamp 每日编程挑战 51:Phone Number Formatter 电话号码格式化全解析

发布时间:2026/11/9 7:59:42

freeCodeCamp 每日编程挑战 51:Phone Number Formatter 电话号码格式化全解析 freeCodeCamp 每日编程挑战 51Phone Number Formatter 电话号码格式化全解析【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp导读本篇文章围绕 freeCodeCamp 开源仓库中的一道真实练习题展开——每日编程挑战第 51 题 Phone Number Formatter电话号码格式化题目位于 JavaScript 每日挑战daily coding challenges模块要求把一段 11 位数字字符串转换成国际格式的电话号码。读完本文你将完整掌握这道题的目标格式、字符串切割的解题思路、官方标准答案与逐行解释、两类测试用例的验证过程并顺着仓库源码看清这类挑战题在 freeCodeCamp 中从 Markdown 题目文件一路被解析、入库、按日期发布再到前端运行的完整链路。题目档案与背景在仓库的课程结构中这道题属于daily-coding-challenges-javascript块其题目源文件为 curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68b7cadffed0e75a517da671.mdfrontmatter 定义如下id: 68b7cadffed0e75a517da671 title: Challenge 51: Phone Number Formatter challengeType: 28 dashedName: challenge-51其中challengeType: 28是理解这道题运行机制的关键数字。在 packages/shared/src/config/challenge-types.ts 中类型 28 被定义为dailyChallengeJs每日 JavaScript 挑战类型 29 为dailyChallengePy每日 Python 挑战这两个类型会被getIsDailyCodingChallenge()统一识别为每日挑战同时getDailyCodingChallengeLanguage()会把它映射为javascript语言。也就是说这道题在 freeCodeCamp 平台上以经典classic布局呈现并采用测试驱动tests的方式判定是否通过。在 curriculum/structure/blocks/daily-coding-challenges-javascript.json 中可以看到它的位置它排在 Challenge 50: Longest Word 之后、Challenge 52: Binary to Decimal 之前属于按编号顺序发布的一系列小型算法挑战中的一环。题目描述理解输入与目标格式原题 description 只有一句话Given a string of eleven digits, return the string as a phone number in this format:D (DDD) DDD-DDDD.翻译过来即给定一个由 11 位数字组成的字符串请将其转换为形如D (DDD) DDD-DDDD的电话号码字符串。注意两个关键约束输入是字符串string而非数字number这一点非常重要下面会说明原因输入长度固定为11 位这意味着无需处理位数不足或超长等异常情况。将目标格式D (DDD) DDD-DDDD拆开看占位符对应的语义如下占位符含义位数取自输入的区间D国家/地区码country code1 位第 1 位下标 0(DDD)区号area code3 位第 24 位下标 13DDD前缀/局号prefix3 位第 57 位下标 46DDDD行号/尾号line number4 位第 811 位下标 710格式中固定包含、一个空格、左右圆括号以及连字符-合计 1 3 3 4 11 位数字恰好与输入位数一一对应。官方测试用例hints题目在--hints--段给出了两个断言测试作为解题时必须通过的验收标准assert.equal(formatNumber(05552340182), 0 (555) 234-0182); assert.equal(formatNumber(15554354792), 1 (555) 435-4792);逐条分解验证05552340182—— 第 1 位是0之后三组依次为555、234、0182拼装结果应为0 (555) 234-018215554354792—— 第 1 位是1之后三组依次为555、435、4792拼装结果应为1 (555) 435-4792。特别注意第一个用例以0开头如果输入被强转为 Number05552340182会变成5552340182前导零会永久丢失。这正是题目坚持字符串输入的用意也决定了解题必须全程以字符串 API 处理。初始代码从空壳函数出发题目给选手准备的种子seed代码非常朴素只返回原样输入function formatNumber(number) { return number; }即当前函数对输入不做任何处理直接返回原字符串因此两个断言均无法通过。选手需要补充的正是从 11 位数字字符串中切出四个片段并按模板拼装的中间逻辑。核心解题思路用slice按区间切割JavaScript 字符串自带String.prototype.slice(start, end)方法它会返回从start含到end不含之间的子串当end省略时表示一直截取到字符串末尾。利用它可以把 11 位字符串按固定宽度切成四段。以输入05552340182为例下标布局如下下标: 0 1 2 3 4 5 6 7 8 9 10 字符: 0 5 5 5 2 3 4 0 1 8 2 └─┘ └───────┘ └───────┘ └───────────┘ country area prefix line对照切片逻辑变量切片表达式截取区间结果countrynumber[0]仅下标 00areanumber.slice(1, 4)下标 1,2,3555prefixnumber.slice(4, 7)下标 4,5,6234linenumber.slice(7)下标 7 至末尾0182其中number[0]以方括号下标方式只取单个字符slice的结束下标均为含头不含尾所以slice(1, 4)精确对应三个字符。官方标准解答与逐行解读该题自带的参考实现位于原 Markdown 的--solutions--段function formatNumber(number) { const country number[0]; const area number.slice(1, 4); const prefix number.slice(4, 7); const line number.slice(7); return ${country} (${area}) ${prefix}-${line}; }逐行解读const country number[0];取出首字符作为国家码如0或1。这里不需要slice(0, 1)直接下标访问即可取得长度为 1 的字符串const area number.slice(1, 4);取第 24 位作为区号const prefix number.slice(4, 7);取第 57 位作为前缀const line number.slice(7);省略结束下标从第 8 位一直取到串尾即 4 位行号返回语句使用 ES6 模板字符串template literal把四段与固定符号拼装成D (DDD) DDD-DDDD。用两个官方用例代入验证formatNumber(05552340182) 0 ( 555 ) 234 - 0182 0 (555) 234-0182 ✅ formatNumber(15554354792) 1 (555) 435-4792 ✅这种解法的核心优势是索引即定义切分区间0 / 1-3 / 4-6 / 7-10与格式模板的位数一一对应代码几乎没有魔法数字歧义易读、易验证且只涉及字符串下标与切片不依赖任何正则表达式属于最契合本题考察意图的写法。边界与约定讨论基于题目给定的 11 位字符串前提可以从代码层面确认几个隐含约定前导零依赖字符串输入country通过number[0]取得字符任何数字运算如parseInt、Number()、一元都会破坏用例一中的前导零因此全程应保持字符串处理长度固定为 11官方切片方案没有做长度校验。若输入出现第 11 位之后的字符slice(7)会把多余字符一并并入line如果不足 11 位则line/prefix会变短或为空。在原题约束成立时无需担心空白字符未处理若输入含首尾空格需先number.trim()本题测试用例未涉及可视为题目保证输入即为纯数字串。拓展其他能通过测试的等价实现以下写法不是题库自带答案而是基于同一测试目标推演出的等价值实现可作为对比思考均以assert.equal两项用例通过为前提。方案 A借助正则的String.replace分组替换function formatNumber(number) { return number.replace( /^(\d)(\d{3})(\d{3})(\d{4})$/, $1 ($2) $3-$4 ); }正则中的^(\d)(\d{3})(\d{3})(\d{4})$强制锚定整串 11 位数字并分成四个捕获组$1~$4在替换字符串中引用对应分组。相比切片法它在输入不是恰好 11 位数字时整个替换不生效原样返回语义上更防御性但可读性略逊。方案 B先拆分再重组function formatNumber(number) { const d number.split(); return ${d[0]} (${d[1]}${d[2]}${d[3]}) ${d[4]}${d[5]}${d[6]}-${d[7]}${d[8]}${d[9]}${d[10]}; }此写法突出逐位取出的过程逻辑上完全等价但冗长程度高于切片法可作为理解下标映射的练习。对比而言官方解法用三次slice完成全部切分代码量最少、区间语义与格式位宽天然对齐是最值得推荐的实现。源码纵深这类挑战题如何在 freeCodeCamp 中运行这道题虽然本身是纯算法小题但把它放到仓库的完整链路里看能获得比单题更多的技术视角。1. JavaScript / Python 双版本并存与入库合并每日挑战并非只有 JavaScript 版本。仓库在 tools/daily-challenges/seed-daily-challenges.ts 中维护了入库脚本它会通过 Gatsby 的 GraphQL 端点分别抓取daily-coding-challenges-javascript与daily-coding-challenges-python两个块的题目按编号一一配对并做一致性校验标题、描述必须相同、测试数量必须相等见 tools/daily-challenges/helpers.ts 中的combineChallenges以 2025-08-11 为起始日期、每个挑战递增一天的方式为挑战分配发布日期脚本头部还硬编码了起始日期的防呆检查START_DATE与2025-08-11T00:00:00.000Z不一致即抛错防止误改导致线上发布错乱预期总数为 365 个挑战二者缺一不可否则直接失败。写入数据库时combineChallenges会去掉标题里的Challenge N:前缀本挑战入库后的标题即Phone Number Formatter并把 JS/Python 两套tests含text与testString与challengeFiles分别存入文档的javascript/python字段。题目的--hints--文本与断言代码正是由此转化为每条测试的text与testString。2. API 按日期对外发布挑战入库后由 API 层负责按日期分发。在 api/src/daily-coding-challenge/routes/daily-coding-challenge.ts 中注册了一组只读 GET 路由/daily-coding-challenge/today返回美国中部时间当天应发布的挑战/daily-coding-challenge/date/:date按YYYY-MM-DD取指定日期的挑战未来日期返回 404/daily-coding-challenge/day/:day按MM-DD取每年固定日期的挑战/daily-coding-challenge/month/:month按YYYY-MM返回整月挑战清单/daily-coding-challenge/all、/daily-coding-challenge/newest获取全集与最新日期。路由中反复出现challenge.date getUtcMidnight(getNowUsCentral())的判断确保尚未到发布日的挑战不会被提前暴露服务端还会通过 Sentry 埋点记录dcc.challenge_viewed、dcc.challenge_not_found等指标。3. 前端渲染与语言切换最终挑战呈现在经典编辑器页面中。前端对 API/数据库返回结构的合法性校验见 client/src/utils/daily-coding-challenge-validator.ts它要求返回对象必须包含id、challengeNumber、title、date、description以及javascript、python两个语言分支各含tests[]与challengeFiles[]。用户在挑战页可通过 client/src/templates/Challenges/classic/action-row.tsx 中的按钮在 JavaScript / Python 之间切换选择偏好会存入本地dailyCodingChallengeLanguage而课程地图上今日挑战的入口则由 client/src/components/daily-coding-challenge/widget.tsx 渲染指向/learn/daily-coding-challenge/{MM-DD}。也就是说从你在 Markdown 里看到的那句 description 与两行断言到浏览器里可交互、可自动判题的完整页面中间隔着题目解析 → 双语言合并入库 → 按日期路由分发 → 前端校验与经典编辑器渲染这条相对完整的工程链路。理解了这条链路再看这道formatNumber小题的考察重点——字符串下标与切片——会更清楚它为何被设计成输入为字符串、固定 11 位、按模板拼装。小结Phone Number Formatter是一道典型的字符串按固定位宽重组题目。需要记住的要点可归纳为保持字符串处理避免任何数值转换破坏前导零用下标与slice对齐格式位宽number[0]取国家码slice(1, 4)、slice(4, 7)、slice(7)分别取区号、前缀与行号用模板字符串一次拼装返回D (DDD) DDD-DDDD结构的完整结果若想深入还可从challengeType: 28出发顺着 packages/shared/src/config/challenge-types.ts、tools/daily-challenges/seed-daily-challenges.ts 与 api/src/daily-coding-challenge/routes/daily-coding-challenge.ts 三条主线把一道小题背后题目即代码、发布即服务的每日挑战工程链路读透。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/9 0:44:20

keploy 实操:5 分钟离线跑通第一条 API 测试用例

keploy 实操:5 分钟离线跑通第一条 API 测试用例 【免费下载链接】keploy Open-source platform for creating safe, isolated production sandboxes for API, integration, and E2E testing. 项目地址: https://gitcode.com/GitHub_Trending/ke/keploy kepl…

2026/11/9 1:41:09

信息技术治理3.1框架:数字化转型中的架构管控实践

1. 项目概述:信息技术治理的日常实践 "每天写点什么"这个系列我已经坚持了三年多,2026年2月5日这篇笔记聚焦的是信息技术治理这个专业领域。作为企业数字化转型的亲历者,我发现很多技术团队在追求创新时常常忽视治理这个基础环节&a…

2026/11/9 0:00:07

A星算法详解:从原理到实战的路径规划指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/9 7:58:46

开封低压电工证复审怎么考,上岗必备别错过这些细节

开封低压电工证复审怎么考,上岗必备别错过这些细节 证书过期了不知道怎么复审延期?别慌,今天咱们就来聊一聊开封低压电工证复审的全流程,从准备材料到考试内容,再到最新的政策变动,全部给你讲清楚,确保你顺利复审,继续上岗!…

2026/11/9 7:58:46

17岁可以考电工证嘛,考前押题怎么选最稳妥

17岁可以考电工证嘛,考前押题怎么选最稳妥 之前考的证在外省能不能转过来?这事儿很多人都问过,答案是能转,但流程不简单。尤其像你这种刚接触电工行业的小年轻,除了关心能不能考,更关心的是怎么考、怎么准备、能不能一次过。今天就从【17岁可以考电…

2026/11/9 7:58:46

电工证多久领证合适呢 证书含金量怎么体现

电工证多久领证合适呢 证书含金量怎么体现 之前考的证在外省能不能转过来?这是很多在外地打工的电工朋友最关心的问题。特别是像南阳地区的水利工程从业者,常常需要在不同省份之间流动,证书能不能顺利转接,直接影响到工作和收入。而证书的 含金量…

2026/11/9 7:53:46

目前考电工证内部消息曝光!别再被中介坑了

目前考电工证内部消息曝光!别再被中介坑了 你是不是正准备 目前考电工证 ,但不知道去哪报名、怕被中介坑?别急,今天给你讲讲真实的流程和避坑经验,全是 内部消息 ,绝对实用。…

2026/11/9 0:37:55

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/9 0:03:09

建设厅的特种工有哪些含金量高?别交完钱考不过

建设厅的特种工有哪些含金量高?别交完钱考不过 怕考不过白交培训费?别急,先搞清楚建设厅的特种工有哪些含金量高的证,再决定是不是值得投入时间和金钱。 建设厅的特种工证是建筑行业里最基础、也最实用的证书之一,涉及多个作业类别,每种证的 含金量…

2026/11/9 0:03:09

荆门市电工证报名怎么考才靠谱 全国通用证别交冤枉钱

荆门市电工证报名怎么考才靠谱 全国通用证别交冤枉钱 怕考不过白交培训费?荆门市电工证报名前必须知道这些避坑指南。别看网上一堆培训机构广告,真要报个电工证,很多人被坑得一塌糊涂。特别是那些打着“包过”旗号的,最后不是考试不过,就是证不是全国通…

2026/11/9 0:03:09

高空电工作业过程通过率揭秘:怎么选靠谱机构不被坑

高空电工作业过程通过率揭秘:怎么选靠谱机构不被坑 不知道去哪报名怕被中介坑?你不是一个人。现在特种作业证报名渠道五花八门,从线下培训机构到线上代理,真假难辨。尤其是像高空电工作业这类高风险、高门槛的作业类型,证书含金量和考试通过率直接影响你…

2026/11/9 6:30:27

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/7 14:50:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑