
freeCodeCamp 每日编程挑战解析Python 实现 File Storage 文件容量计算【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp本篇技术指南以 freeCodeCamp 开源课程仓库中daily-coding-challenges-python模块的 Challenge 41 File Storage 为讲解对象完整剖析这道 Python 算法挑战的题目约束、单位换算规则、全部测试用例与官方参考解法并结合同模块的 Photo Storage、Video Storage 系列挑战以及仓库内的测试与播种脚本讲透将任意单位统一换算后做整除这一类容量计算题的通用解法。读完本文你将能够独立完成该挑战并理解其背后的十进制单位换算约定与仓库级验证机制。挑战背景每日编码挑战模块中的 File Storage这道题为daily-coding-challenges-python区块Block中的 Challenge 41位于仓库路径 curriculum/challenges/english/blocks/daily-coding-challenges-python/68b1f72371a5ac895ac70a04.md。该区块属于dev-playground超级区块SuperBlock与 JavaScript 版本的daily-coding-challenges-javascript区块一一对应。从区块元数据文件 curriculum/structure/blocks/daily-coding-challenges-python.json 可以看到该区块使用legacy-challenge-list布局、usesMultifileEditor: true帮助分类为 Python并且整个区块被标记为isUpcomingChange: true。区块内按编号排列了数百道挑战Challenge 41 前后依次是 Challenge 40: Photo Storage 与 Challenge 42: Video Storage——三者构成了一条由简到繁的存储容量计算系列。在仓库测试 curriculum/src/test/daily-challenges.test.js 中会校验 JavaScript 与 Python 两套每日挑战在数量、ID、标题、描述以及测试用例数量上完全一致因此本文讲解的 Python 版number_of_files与 JS 版numberOfFiles在逻辑上是对称的。题目原文与约束解读题目要求给定一个文件大小file size、该文件大小的单位unit以及硬盘容量以 GB 为单位返回该硬盘最多能存储的完整文件个数。具体约束如下文件大小的单位只能是字节B、千字节KB或兆字节MB。返回硬盘能装下的整文件数量数量必须是整数不能有小数部分。必须使用下表规定的换算关系单位等价1 B1 B1 KB1000 B1 MB1000 KB1 GB1000 MB题目给出的示例是给定500、KB、1三个参数即判断一个 1 GB 的硬盘能存放多少个 500 KB 的文件。这里有一个值得注意的关键约定本挑战使用十进制换算1000而不是计算机存储领域常见的二进制换算1024。也就是说1 KB 1000 B1 MB 1000 KB1 GB 1000 MB1 GB 严格等于 10^9 字节。这个约定直接决定了答案的数量级是本题最容易踩坑的地方。函数签名与种子代码挑战提供了种子代码seed contents定义了需要实现的函数骨架def number_of_files(file_size, file_unit, drive_size_gb): return file_size三个参数的含义file_size单个文件的大小可以是整数或浮点数测试用例中出现了220.5、4.5等小数。file_unit文件大小对应的单位字符串取值只能是B、KB、MB。drive_size_gb硬盘容量单位固定为 GB同样可以是整数或小数测试用例中有1.5、100、750等。种子代码目前只是原样返回file_size需要通过单位换算逻辑替换为正确答案。解题思路统一换算到字节再做整除这类容量换算题目的标准解法是三步走把硬盘容量换算成字节drive_size_bytes drive_size_gb * 1000 * 1000 * 1000即乘以 10^9。把单个文件大小换算成字节根据file_unit的分支决定乘数——B乘以 1KB乘以 1000MB乘以 1000 × 1000。用硬盘总字节数除以单个文件字节数向下取整得到能存放的完整文件数量。之所以要向下取整floor是因为题目明确要求返回整文件个数——硬盘剩余空间不足以再放下一个完整文件时多余的部分必须舍弃。例如 1 GB 硬盘放 500 KB 文件1000000000 // 500000 2000恰好整除而4096字节的文件放进1.5GB 硬盘时1500000000 // 4096 366210余下的字节不足以再容纳一个文件。官方参考解法逐行解析挑战的--solutions--部分给出了官方参考实现def number_of_files(file_size, file_unit, drive_size_gb): drive_size_bytes drive_size_gb * 1000 * 1000 * 1000 if file_unit B: file_size_bytes file_size elif file_unit KB: file_size_bytes file_size * 1000 else: file_size_bytes file_size * 1000 * 1000 return int(drive_size_bytes // file_size_bytes)逐行拆解第 1 行drive_size_bytes drive_size_gb * 1000 * 1000 * 1000。因为参数固定以 GB 为单位所以直接把容量统一换算为字节。连续乘三个1000的写法避免了引入**运算符的额外复杂度也直观对应 1 GB 10^9 B。第 3–7 行if / elif / else分支根据单位字符串把文件大小换算成字节。由于题目约束单位只能是B、KB、MB三者之一else分支可以安全地覆盖MB情形无需对非法单位做额外校验非法单位校验是 Challenge 42 才引入的要求。第 9 行int(drive_size_bytes // file_size_bytes)。//是 Python 的整除运算符先得到向下取整的商再包一层int()把结果显式转换为整数类型确保函数始终返回int而非浮点数。当file_size或drive_size_gb为浮点数时//依然能正确向下取整配合int()消除了可能残留的小数位。作为对比JavaScript 版本见 curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68b1f72371a5ac895ac70a04.md使用Math.floor(driveSizeBytes / fileSizeBytes)实现同样的向下取整逻辑二者在算法思想上完全一致。全部测试用例验证挑战的--hints--部分通过unittest框架内嵌了 6 个测试用例覆盖了整数、浮点、不同单位组合等场景调用期望结果计算过程number_of_files(500, KB, 1)20001 GB 10^9 B500 KB 500000 B10^9 // 500000 2000number_of_files(50000, B, 1)2000010^9 // 50000 20000number_of_files(5, MB, 1)2005 MB 5000000 B10^9 // 5000000 200number_of_files(4096, B, 1.5)3662101.5 GB 1.5 × 10^9 B1500000000 // 4096 366210number_of_files(220.5, KB, 100)453514100 GB 10^11 B220.5 KB 220500 B10^11 // 220500 453514number_of_files(4.5, MB, 750)166666750 GB 7.5 × 10^11 B4.5 MB 4500000 B750000000000 // 4500000 166666这些用例验证了几个关键点三种单位B/KB/MB都必须正确处理file_size与drive_size_gb都可以是浮点数当不能整除时结果必须向下取整。例如最后一个用例750 GB 严格能放下 166666.66… 个 4.5 MB 文件但只能返回整数166666。在实际环境中这些测试通过 Python 的unittest.TestCase.assertEqual断言执行runPython桥接脚本会在挑战运行时注入到 Python 解释器中。同系列挑战的递进关系理解 File Storage 在系列中的位置有助于把握它的设计意图Challenge 40: Photo Storage68b1f72371a5ac895ac70a02.mdnumber_of_photos(photo_size_mb, drive_size_gb)只有两个参数单位全部固定MB 与 GB解法只需一行drive_size_mb // photo_size_mb。它是本挑战的简化前置题。Challenge 41: File Storage本题引入了单位字符串参数file_unit需要分支判断换算难度升级为单位换算 整除。Challenge 42: Video Storage68b1f72371a5ac895ac70a06.mdnumber_of_videos(video_size, video_unit, drive_size, drive_unit)进一步把硬盘单位也变成参数支持 GB/TB并要求对非法单位返回Invalid video unit或Invalid drive unit字符串其官方解法使用字典{KB: 1000, MB: 1000*1000, GB: 1000*1000*1000}与{GB: ..., TB: ...}做查找展示了用查表替代多分支 if-else 的进阶写法。可以看出File Storage 恰好处于单参数单位换算与多单位 非法值处理之间的中间难度是掌握字典查表法与分支判断的分水岭。挑战在仓库中的运行与验证机制从仓库工程视角看这道挑战并非孤立的教学文件而是每日编码挑战生产链路的一环内容来源挑战 Markdown 文件位于dev-playground超级区块的daily-coding-challenges-python区块中challengeType: 29标识其为 Python 编程挑战JS 版对应challengeType: 28。双语一致性校验curriculum/src/test/daily-challenges.test.js 中的测试会断言 JS 与 Python 两套挑战数量相同、ID 一一对应、标题与描述一致、测试用例数量相等确保每日挑战的跨语言质量。数据库播种tools/daily-challenges/seed-daily-challenges.ts 脚本通过 GraphQL 从运行中的客户端需开启 upcoming changes拉取 dev-playground 区块的挑战数据将 JS/Python 两个版本按天配对每个挑战对应一个从 2025-08-11 起递增的日期写入 MongoDB 的DailyCodingChallenges集合。脚本内置EXPECTED_CHALLENGE_COUNT 365的数量检查与起始日期保护若数量不符会抛错或告警。具体的挑战数据结构description、tests、challengeFiles等字段定义在 tools/daily-challenges/types.ts 中。因此你在学习本题时既可以把它当作纯 Python 算法练习也可以结合播种脚本理解它如何被转化为数据库中的每日一题记录并最终呈现在用户面前。总结Challenge 41 File Storage 的核心价值在于训练三个基本功单位换算的规范化识别题目使用的是十进制1000而非二进制1024换算这是存储类题目最常见的陷阱分支与查表的选择当单位种类有限时用 if-elif-else 足够清晰单位变多时则适合切换到字典查表如 Challenge 42 所示整除与类型安全用//保证向下取整用int()保证返回整数类型避免浮点误差污染结果。掌握了这三点的组合运用你不仅能通过这道挑战的全部 6 个测试用例还能平滑地迁移到同系列 Photo Storage 与 Video Storage 的进阶题目中。进一步的学习路径是阅读仓库内的 tools/daily-challenges/README.md 了解每日挑战从课程文件到生产数据库的完整播种流程。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考