ARTICLE DETAIL

资讯详情

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

freeCodeCamp 每日编程挑战解析:用 Python 实现 Binary to Decimal(二进制转十进制)

freeCodeCamp 每日编程挑战解析:用 Python 实现 Binary to Decimal(二进制转十进制) freeCodeCamp 每日编程挑战解析用 Python 实现 Binary to Decimal二进制转十进制【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp本篇技术指南围绕 freeCodeCamp 开源仓库中的 Python 每日编程挑战Challenge 52: Binary to Decimal挑战原文展开完整讲解题目要求、进制转换原理、官方测试用例、官方参考解法并结合仓库源码剖析其双语言Python/JavaScript同步机制、自动化验证流程以及每日挑战的数据库发布链路。读完本文你既能独立完成该挑战并通过全部测试也能理解这类挑战在 freeCodeCamp 课程体系中的完整生命周期。一、挑战背景什么是 Daily Coding Challengedaily-coding-challenges-python是 freeCodeCamp 课程体系中的一个挑战块block位于dev-playground超级块superblock之下。该块以legacy-challenge-list布局呈现当前标记为isUpcomingChange: true并使用多文件编辑器usesMultifileEditor: true帮助分类为Python具体配置见 daily-coding-challenges-python.json。这个挑战块的特殊之处在于仓库同时维护了功能完全对等的JavaScript 版本挑战块daily-coding-challenges-javascript配置见 daily-coding-challenges-javascript.jsonhelpCategory为 JavaScript。Challenge 52 在两个语言块中各有一份题目文件且共享同一个挑战 ID68b7cadffed0e75a517da673语言文件路径challengeTypePython68b7cadffed0e75a517da673.md29JavaScript68b7cadffed0e75a517da673.md28在 daily-coding-challenges-python.json 的challengeOrder中本挑战被登记为Challenge 52: Binary to Decimal紧随其后的Challenge 53: Decimal to BinaryID68b7cadffed0e75a517da675与本挑战互为逆运算构成一组非常经典的进制转换练习。二、题目要求与进制转换原理题目原文Given a string representing a binary number, return its decimal equivalent as a number.即给定一个表示二进制数的字符串返回其对应的十进制数值number 类型。转换原理二进制数只使用0和1两个数字来表示任意数值。要将二进制转换为十进制需要把每一位乘以2的幂次然后求和最右侧一位乘以2^0其左侧相邻一位乘以2^1依此类推每一位的幂次从右向左递增例如二进制数101转换为十进制等于51 * 2^2 0 * 2^1 1 * 2^0 4 0 1 5这一原理是理解整个挑战的核心二进制是一种基数为 2 的位置计数法每一位的权重是 2 的幂而非十进制中的 10 的幂。三、测试用例Hints逐条解析挑战文件中的--hints--部分定义了 4 个测试断言全部通过runPython包装的 Python 标准库unittest执行。注意 Python 版本的函数命名为snake_caseto_decimal与 JavaScript 版的toDecimal命名风格保持一致。测试输入期望输出推导过程to_decimal(101)51×2² 0×2¹ 1×2⁰ 4 0 1to_decimal(1010)101×2³ 0×2² 1×2¹ 0×2⁰ 8 0 2 0to_decimal(10010)181×2⁴ 0 0 1×2¹ 0 16 2to_decimal(1010101)8564 16 4 1 85每个测试用例的实际断言代码如下以第一个为例({test: () { runPython( from unittest import TestCase TestCase().assertEqual(to_decimal(101), 5)) }})这里揭示了 freeCodeCamp 挑战的双层测试机制外层用 JavaScript 的runPython内嵌 Python 代码片段内层则调用 Pythonunittest.TestCase.assertEqual做严格相等断言。这意味着你的to_decimal函数必须返回 Python 的整数5而不是字符串5。四、初始代码与官方参考解法初始代码Seeddef to_decimal(binary): return binary初始函数只是把输入原样返回101返回101字符串显然无法通过任何测试。你需要在函数体内实现真正的转换逻辑。官方参考解法def to_decimal(binary): decimal 0 for i, bit_char in enumerate(reversed(binary)): bit int(bit_char) decimal bit * (2 ** i) return decimal逐行解读reversed(binary)反转字符串使最右侧最低位的字符排在第一位从而让枚举下标i直接对应 2 的幂次enumerate(...)同时取出下标i与字符bit_char其中i即该位应乘的幂次int(bit_char)把单个字符0或1转换为整数0或1decimal bit * (2 ** i)按位置权累加等价于题目描述中的每位乘以 2 的幂后求和函数返回整数decimal与测试断言的类型要求一致。复杂度分析设二进制字符串长度为n该解法只需一次线性遍历时间复杂度为O(n)空间复杂度为O(1)属于该问题的最优量级。五、JavaScript 版本的对照实现为保证每日挑战对编程语言选择的包容性仓库为同一挑战维护了 JS 版本。其初始代码与参考解法如下function toDecimal(binary) { let decimal 0; for (let i 0; i binary.length; i) { const bit parseInt(binary[binary.length - 1 - i], 10); decimal bit * Math.pow(2, i); } return decimal; }与 Python 解法对照可发现同一算法的两种语言形态Python 用reversed(binary)enumerate从左向右携带幂次信息JS 用下标换算binary.length - 1 - i从右向左取位配合Math.pow(2, i)计算权重两者都遵循从右往左、位权递增的核心算法骨架。六、双语言一致性的自动化保障你可能好奇两个语言版本的挑战如何保证不跑偏答案在测试文件 daily-challenges.test.js 中。该文件基于 Vitest 编写核心校验逻辑包括数量匹配JS 与 Python 两个块必须都存在且挑战数量大于 0数量相等JS 与 Python 的每日挑战数量必须完全一致属性一致按索引逐一配对校验每个挑战的id、title、description和测试数量tests数组长度是否完全一致任何不匹配都会将错误信息汇总后触发断言失败。这解释了为什么 Python 挑战的 ID68b7cadffed0e75a517da673与 JS 版本完全相同——这是仓库刻意设计的一一对应关系。七、从挑战文件到每日推送种子脚本链路Daily Coding Challenge 并非静态页面而是按每天一道题的节奏推送。理解这一机制可以帮你更好地定位本题在生产环境中的角色。核心脚本是 seed-daily-challenges.ts从dev-playground超级块通过 GraphQL 抓取全部挑战客户端需开启 upcoming changes 才能暴露这些内容分别获取 JavaScript 与 Python 两个语言版本的挑战数组并要求两者数量相等此处期望365 道对应全年每日一题调用 helpers.ts 中的combineChallenges将同一天的 JS 与 Python 挑战合并为一条记录并关联一个日期——起始日期硬编码为2025-08-11T00:00:00.000Z每道题顺延一天24 * 60 * 60 * 1000ms通过 MongoDB 的bulkWritereplaceOne(upsert)写入DailyCodingChallenges集合实现已存在则替换、不存在则插入脚本内置起始日期校验与文档总数校验防止意外改动影响已发布排期。因此Challenge 52 会被分配到一个具体日期在前端widget.tsx的今日挑战入口中被渲染出来。从这个角度看to_decimal不仅是一道练习题更是 freeCodeCamp每天一道编码挑战产品形态中的一环。八、延伸思考配套的进制转换挑战本题所在的块还围绕进制与编码安排了多个姊妹挑战可一起练习形成体系Challenge 53: Decimal to Binary68b7cadffed0e75a517da675与本题互为逆运算将十进制转为二进制Challenge 62: Hex to Decimal68c497f3aaefc9fd9f1b0e26十六进制转十进制幂次变为 16Challenge 166: Hex Validator696655d24b614176d4c9b789校验十六进制字符串合法性。这些挑战共享同一套按位乘幂累加的思想区别仅在于基数base不同。掌握to_decimal的写法后你可以在本地用 Python 交互式环境验证任意输入# 本地手动验证 to_decimal(101) 5 to_decimal(1010101) 85 # 对照 Python 内置能力 int(101, 2) 5需要说明的是int(binary, 2)是 Python 内置的快速转换方案但本挑战的目的正是让你手写实现这一过程以加深对位置计数法与位权的理解。若你希望验证更多边界输入可自行扩展测试例如0应返回0、11111111应返回255——这些均不属于原文档的强制断言但有助于巩固对算法的掌握。九、小结通过本文你已完整掌握 freeCodeCamp Challenge 52 Binary to Decimal 的全部要素算法本质将二进制字符串按位乘以 2 的幂并累加得到十进制整数验收标准to_decimal需通过 4 个基于unittest的断言覆盖 4 位到 7 位不等的二进制输入参考实现reversedenumerateint的线性遍历解法时间复杂度O(n)仓库机制本挑战以相同 ID 存在于 PythonchallengeType 29与 JavaScriptchallengeType 28两个版本通过 daily-challenges.test.js 保证双语言一致性并最终由 seed-daily-challenges.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),仅供参考
返回列表