ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

freeCodeCamp Python 每日编程挑战第 42 题解析:Video Storage 容量换算与单位校验实现

freeCodeCamp Python 每日编程挑战第 42 题解析:Video Storage 容量换算与单位校验实现 freeCodeCamp Python 每日编程挑战第 42 题解析Video Storage 容量换算与单位校验实现【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCampfreeCodeCamp 仓库中的daily-coding-challenges-python课程块以每日一题的形式训练 Python 基础能力本篇文章聚焦其中的Challenge 42: Video Storage根据视频大小、视频单位、硬盘容量与硬盘单位计算一块硬盘最多能存下多少部完整视频。这道题综合考察了十进制单位换算、输入合法性校验、字典映射与向下取整除法是理解真实世界单位换算 防御性编程组合的典型练习。读完本文你将掌握该题的全部约束、官方测试用例、标准解法以及它在 freeCodeCamp 每日挑战流水线课程 Markdown → GraphQL → MongoDB → API → 前端校验中的位置。题目定义参数、单位约束与换算表原题位于 68b1f72371a5ac895ac70a06.md函数签名为def number_of_videos(video_size, video_unit, drive_size, drive_unit):四个参数的含义如下参数含义允许取值video_size单个视频的大小数值任意非负数题目用例含整数与浮点数video_unit视频大小单位B、KB、MB、GBdrive_size硬盘容量数值任意非负数drive_unit硬盘容量单位GB、TB题目明确规定了三组约束视频单位只能是字节B、千字节KB、兆字节MB或吉字节GB若传入其他单位返回Invalid video unit硬盘单位只能是吉字节GB或太字节TB若传入其他单位返回Invalid drive unit返回硬盘能容纳的完整视频数量向下取整即只能装下整数部视频。十进制换算表关键细节题目给出的换算关系是1000 进制十进制而非计算机存储领域常见的 1024 进制二进制这一点是本题最容易踩坑的地方单位等价关系1 B1 B1 KB1000 B1 MB1000 KB1 GB1000 MB1 TB1000 GB换算链可以统一到字节1 KB 1000 B1 MB 1000 × 1000 B1 GB 1000 × 1000 × 1000 B1 TB 1000 × 1000 × 1000 × 1000 B。因此实现时建议先把两个数值都换算成字节再相除避免跨单位直接计算带来的精度与逻辑错误。题目给出了一个直观示例给定500、MB、100、GB即一块 100 GB 硬盘能存多少部 500 MB 的视频——答案为 200 部100 GB 100,000 MB100000 // 500 200。官方测试用例五组边界验证该挑战的--hints--部分内嵌了基于 Pythonunittest的测试覆盖了正常换算、非法视频单位、非法硬盘单位、跨多级单位换算与浮点输入五种场景from unittest import TestCase TestCase().assertEqual(number_of_videos(500, MB, 100, GB), 200) TestCase().assertEqual(number_of_videos(1, TB, 10, TB), Invalid video unit) TestCase().assertEqual(number_of_videos(2000, MB, 100000, MB), Invalid drive unit) TestCase().assertEqual(number_of_videos(500000, KB, 2, TB), 4000) TestCase().assertEqual(number_of_videos(1.5, GB, 2.2, TB), 1466)逐一分析这些用例的设计意图number_of_videos(500, MB, 100, GB) → 200基础换算验证十进制换算100 GB 100,000 MBnumber_of_videos(1, TB, 10, TB) → Invalid video unitTB不在视频单位白名单中即使它与硬盘单位合法也必须返回错误字符串验证两套单位独立校验number_of_videos(2000, MB, 100000, MB) → Invalid drive unitMB不在硬盘单位白名单中验证单位校验的顺序与独立性number_of_videos(500000, KB, 2, TB) → 4000跨 4 个量级换算2 TB 2,000,000,000 KB2000000000 // 500000 4000验证换算表正确性number_of_videos(1.5, GB, 2.2, TB) → 1466浮点输入2.2 TB 2,200,000,000,000 B1.5 GB 1,500,000,000 B两者相除约 1466.67向下取整为 1466验证结果必须向下取整为整数。注意第三组用例的返回类型非法输入时返回的是错误字符串而正常输入时返回的是整数因此实现时必须在换算之前完成单位校验否则会出现类型与逻辑双重错误。官方标准解法逐行拆解挑战文件的--solutions--部分给出了官方参考实现def number_of_videos(video_size, video_unit, drive_size, drive_unit): video_units {KB: 1000, MB: 1000 * 1000, GB: 1000 * 1000 * 1000} drive_units {GB: 1000 * 1000 * 1000, TB: 1000 * 1000 * 1000 * 1000} if video_unit not in video_units: return Invalid video unit if drive_unit not in drive_units: return Invalid drive unit video_bytes video_size * video_units[video_unit] drive_bytes drive_size * drive_units[drive_unit] return int(drive_bytes // video_bytes)该解法体现了三个核心设计1. 字典映射代替分支判断。用两个字典分别保存单位 → 字节倍数的映射视频单位字典从KB起步B的倍数为 1换算到字节时可省略因为乘以 1 不改变结果硬盘单位字典只含GB与TB。字典查找天然充当白名单单位不在键集合中即判定为非法。2. 校验先行换算在后。先检查video_unit再检查drive_unit任何一方非法都立即返回错误字符串绝不进入换算逻辑。这保证了返回值类型的确定性要么是错误提示要么是整数结果。3. 统一字节基准 向下取整。两边都换算到字节后直接相除//地板除法天然实现向下取整得到最多能放几部完整视频。外层再用int()包裹以确保浮点输入如 1.5、2.2参与运算后返回的是整数而非浮点数——这正是第 5 个用例1466通过的关键。一个可以探讨的等价写法是把B也显式加入视频字典video_units {B: 1, KB: 1000, ...}逻辑上完全等价显式写出B会更贴近题目给的换算表便于读者对照。边界情况与易错点总结结合官方测试做题时最容易出错的地方集中在四点进制混用把 1 MB 当成 1024 KB 会导致答案系统性偏小。题目明确给出的是 1000 进制换算表必须以题目为准单位校验遗漏B是合法的视频单位但不是合法的硬盘单位TB是合法的硬盘单位但不是合法的视频单位。两套白名单互不相同、各自独立向下取整int(drive_bytes // video_bytes)中//的优先级与类型转换必须正确。若直接用/再int()也能得到相同结果正数场景下int()即为截断但//语义更明确需要警惕的是浮点除法可能产生1466.666...这样的结果若只做浮点除法不取整用例 5 就会失败校验顺序先校验视频单位再校验硬盘单位或反之但必须保证两者都在换算之前完成否则非法输入会被当成数值参与计算抛出KeyError或返回错误数字。这道题在 freeCodeCamp 仓库中的位置与运行机制Challenge 42 不是孤立的一道题它隶属于 freeCodeCamp 完整的每日编码挑战体系理解这一体系有助于把握题目的编辑与校验方式。挑战类型与课程块结构在 challenge-types.ts 中challengeType数值 29 被定义为dailyChallengePy即Python 每日挑战本文件头部 frontmatter 中的challengeType: 29正是引用该枚举。该挑战所在的课程块定义在 daily-coding-challenges-python.json其中helpCategory为Python表示归类于 Python 帮助分类blockLayout为legacy-challenge-listisUpcomingChange为true表示该课程块属于开发中upcoming内容challengeOrder数组按顺序列出 Challenge 1 到 Challenge 200 的完整题目清单本文件id68b1f72371a5ac895ac70a06在列表中登记为Challenge 42: Video Storage其前序是 Challenge 41: File Storage68b1f72371a5ac895ac70a04后序是 Challenge 43: Digits vs Letters68b1f72371a5ac895ac70a08。从 Markdown 到线上题目的数据链路从源码结构可以梳理出一条完整的流水线帮助理解这类挑战文件如何变成用户在页面上看到并运行的每日一题课程源文件每个挑战以 Markdown 形式存放在 curriculum/challenges/english/blocks/daily-coding-challenges-python 目录下--description--、--hints--、--seed--、--solutions--四段构成题目的全部内容GraphQL 拉取tools/daily-challenges/helpers.ts 中的fetchChallenges通过allChallengeNodeGraphQL 查询filter指定superBlock: dev-playground与block: daily-coding-challenges-python从运行中的主客户端Gatsby端口 8000拉取题目数据包括id、title、description、tests与challengeFilesJS/Python 配对合并seed-daily-challenges.ts 同时拉取 JavaScript 与 Python 两套挑战combineChallenges会严格校验两套题目的标题、描述一致且测试数量相同然后把 Python 题目的测试与起始代码挂到python字段下合并写入 MongoDB 的DailyCodingChallenges集合API 对外暴露daily-coding-challenge.ts 注册了/daily-coding-challenge/date/:date、/day/:day、/today、/month/:month、/all、/newest等只读 GET 路由按日期返回对应挑战不会返回晚于美国中部时间当天的未来题目前端校验daily-coding-challenge-validator.ts 用 Joi 对数据库返回的挑战数据做结构校验要求id、challengeNumber、title、date、description以及javascript/python两套tests与challengeFiles字段齐全。也就是说你在仓库里看到的这道 Video Storage 挑战其--hints--中的runPython测试字符串最终会随种子脚本进入数据库并在每日挑战页面对应前端组件位于 client/src/components/daily-coding-challenge中作为 Python 运行环境下的自动化断言来执行。拓展练习让解法更健壮在官方解法的思路上还可以从三个方向继续打磨这道题的实现统一单位表把B显式纳入视频单位字典并将换算倍数集中定义便于日后扩展PB、EB等更大单位数值合法性校验题目未要求校验video_size、drive_size为非负但实际实现中可补充负数或零值处理避免除零与负数结果的语义歧义提前返回与清晰错误信息保持非法输入优先返回的结构把错误字符串提取为常量让调用方更容易通过相等比较判断错误类型。小结Challenge 42: Video Storage 是一道小而完整的实战题它在真实场景视频与硬盘容量中训练十进制单位换算同时通过双白名单机制强化输入校验意识用向下取整除法约束输出语义并用五组精心设计的unittest用例覆盖正常、非法与浮点输入。结合 挑战源文件、挑战类型定义 与 每日挑战种子脚本 一起阅读你既能掌握题目本身的解法也能看清它在 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),仅供参考
返回列表