资讯动态

freeCodeCamp 每日编程挑战深度解析:Challenge 221 Inverted Matrix(矩阵双值反转)

发布时间:2026/9/10 16:51:23 来源:尧图企业网站定制
freeCodeCamp 每日编程挑战深度解析Challenge 221 Inverted Matrix矩阵双值反转【免费下载链接】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 Challenge第 221 题Inverted Matrix展开完整还原题目定义与全部测试用例逐步拆解官方参考解法的实现原理并结合仓库源码说明这套挑战体系背后的工程实现题目结构、测试断言、API 数据层与前端组件。读完本文你不仅能独立 AC 这道矩阵反转题还能理解一道每日挑战从 Markdown 题目到线上可运行体系的完整链路。题目概述invertMatrix接收一个数组的数组矩阵矩阵中只填充两个互不相同的值。要求返回一个新矩阵其中这两个值的每一次出现都被互相交换即反转/取反。一个直观的例子给定如下矩阵[ [a, b], [a, a] ]应返回[ [b, a], [b, b] ]即矩阵中所有的a变为b所有的b变为a。整个过程类似二值图像的反色/取反操作也等价于布尔矩阵的NOT运算。该题目对应的原始挑战文件位于 curriculum/challenges/english/blocks/daily-coding-challenges-javascript/699c8e045ee7cb94ed2322dc.md属于daily-coding-challenges-javascript这个挑战块Block是dev-playground超级块下的 JavaScript 系列每日挑战之一。完整测试用例解析Hints题目通过 5 组assert.deepEqual测试用例来校验实现。它们覆盖了不同的数据类型、矩阵尺寸与形状理解这些用例是写出健壮解法的关键。用例 1字符串 2×2 矩阵题目示例本身assert.deepEqual(invertMatrix([[a, b], [a, a]]), [[b, a], [b, b]]);用例 2整数 0/1 的 3×3 矩阵布尔式反转assert.deepEqual(invertMatrix([[1, 0, 1], [1, 1, 1], [0, 1, 0]]), [[0, 1, 0], [0, 0, 0], [1, 0, 1]]);用例 3长字符串的 3×4 非方阵assert.deepEqual( invertMatrix([ [apple, banana, banana, apple], [banana, apple, apple, banana], [banana, banana, banana, apple] ]), [ [banana, apple, apple, banana], [apple, banana, banana, apple], [apple, apple, apple, banana] ] );用例 4整数 6/7 的 5×5 方阵assert.deepEqual( invertMatrix([ [6, 7, 7, 7, 6], [7, 6, 7, 6, 7], [7, 7, 6, 7, 7], [7, 6, 7, 6, 7], [6, 7, 7, 7, 6] ]), [ [7, 6, 6, 6, 7], [6, 7, 6, 7, 6], [6, 6, 7, 6, 6], [6, 7, 6, 7, 6], [7, 6, 6, 6, 7] ] );用例 5浮点数 1.2/2.1 的 3×4 非方阵assert.deepEqual( invertMatrix([ [1.2, 2.1, 2.1, 2.1], [2.1, 1.2, 2.1, 1.2], [1.2, 1.2, 2.1, 2.1] ]), [ [2.1, 1.2, 1.2, 1.2], [1.2, 2.1, 1.2, 2.1], [2.1, 2.1, 1.2, 1.2] ] );从这 5 组用例可以归纳出题目隐含的约束维度观察到的约束值类型字符串、整数、浮点数均可但同一矩阵内只出现两种不同的值矩阵形状既测试了方阵2×2、3×3、5×5也测试了非方阵3×4解法需与行列数无关值分布两种值在矩阵中的占比任意用例 4 呈现明显的对称图案比较语义使用deepEqual深度比较要求返回值是新矩阵结构而非原地修改的引用种子代码Seed挑战给出的初始模板如下学习者需要补全invertMatrix的实现并返回结果function invertMatrix(matrix) { return matrix; }注意种子代码默认直接返回传入的matrix即恒等实现它只能通过空转无法通过任何一组测试。学习者必须把找出两种值和逐格互换两个逻辑补上。官方参考解法挑战文件内自带的官方解法见 --solutions-- 节如下function invertMatrix(matrix) { if (matrix.length 0) return []; const values [...new Set(matrix.flat())]; const [val1, val2] values; return matrix.map(row row.map(cell (cell val1 ? val2 : val1)) ); }解法只有 5 行核心逻辑却完整覆盖了题目的全部约束下面逐行拆解其原理。解法原理深度拆解第一步空矩阵保护if (matrix.length 0) return [];matrix.flat()对空数组返回[]new Set([])得到空集合后续const [val1, val2] values中val1与val2都会是undefined导致逻辑错误。因此先对空矩阵做短路处理。这是所有通过用例的解法都需要的防御性分支——虽然 5 组测试没有显式传入空矩阵但它让函数对合法输入集合外的场景也保持正确。第二步用 Set 找出两个不同的值const values [...new Set(matrix.flat())]; const [val1, val2] values;matrix.flat()将二维数组展平为一维数组无论矩阵是几行几列都能一次性拿到全部元素new Set(...)基于SameValueZero语义去重因而对字符串、整数、浮点数都适用且不会发生隐式类型转换例如数字1与字符串1会被视为不同元素展开运算符[...]将 Set 转回数组再通过数组解构取出val1、val2两个值。顺序敏感性Set保留元素首次出现的顺序因此val1恒为矩阵中第一个出现、且不等于后续值的那个元素。以用例 1 为例matrix.flat()得到[a,b,a,a]去重后为[a,b]即val1 a、val2 b。第三步双重 map 完成全量互换return matrix.map(row row.map(cell (cell val1 ? val2 : val1)) );外层matrix.map(...)遍历每一行内层row.map(...)遍历行内每个单元格对每个单元格做一次严格相等判断等于val1就替换为val2否则替换为val1由于题目保证矩阵中只存在两种不同的值cell val1 ? val2 : val1恰好覆盖所有情况且天然对非方阵不同行长成立map返回全新的数组不修改原矩阵因此满足返回一个新矩阵的语义也与deepEqual的深度比较兼容。时间复杂度与空间复杂度时间展平O(m×n) 双重mapO(m×n)总体O(m×n)其中 m 为行数、n 为列数对非方阵需按最大列数理解空间flat()产生的临时一维数组O(m×n)输出新矩阵O(m×n)。对每日挑战的输入规模而言这个复杂度完全足够。边界情况与进阶思考官方解法在题目约束下是恰好够用的以下是值得深入思考的扩展点只有一种值的情况若矩阵只含一种值values数组长度为 1val2为undefined此时等于val1的单元格会被换成undefined。题目明确约定filled with two distinct values因此测试不会覆盖该场景但若要在生产代码中使用建议增加values.length 1的守卫。空行[[]]matrix.length ! 0但matrix.flat()结果为空同样会触发val1/val2为undefined的问题。可增加对values.length 2的统一校验。引用类型元素若元素是对象/数组Set去重基于引用而非结构相等比较同理。题目只涉及原始类型故无需处理。原地修改 vs 返回新矩阵deepEqual只校验值相等不校验引用是否相同因此理论上原地修改也能通过测试但题目措辞 return a new matrix 与官方解法均遵循不可变风格推荐保持。背后的工程体系一道每日挑战如何运转这道题并非孤立存在而是 freeCodeCamp 每日挑战体系中的一个环节仓库中可以看到完整的配套实现。挑战块与题目编排curriculum/structure/blocks/daily-coding-challenges-javascript.json定义了daily-coding-challenges-javascript块的元数据isUpcomingChange: true、usesMultifileEditor: true、helpCategory: JavaScript并按顺序列出全部题目的 id 与标题。本文题目Challenge 221: Inverted Matrixid699c8e045ee7cb94ed2322dc位于第 221 个位置其前后分别是 Challenge 220Largest Number与 Challenge 222Equinox Shadows。题目 Markdown 的 frontmatter 中challengeType: 28即每日编程挑战这一挑战类型的编号。JS/Python 双版本一致性保障curriculum/src/test/daily-challenges.test.js中的测试会同时加载 JavaScript 与 Python 两个挑战块并断言两侧挑战数量一致每对挑战的 id、标题、描述一致两侧的测试用例数量一致。这意味着每个每日挑战包括本题都有对应的 Python 版本题目内容与测试是双语种严格同步的。API 数据层api/src/daily-coding-challenge/routes/daily-coding-challenge.ts提供了按日期查询每日挑战的公开路由例如GET /daily-coding-challenge/date/:date按YYYY-MM-DD查询且不会返回晚于今日的题目GET /daily-coding-challenge/day/:day按MM-DD查询借助getSourceDate映射回原始挑战日期GET /daily-coding-challenge/today返回当天题目GET /daily-coding-challenge/month/:month与GET /daily-coding-challenge/all批量返回标题列表按日期倒序。对应的请求/响应结构在 api/src/daily-coding-challenge/schemas/daily-coding-challenge.ts 中用 TypeBox 定义单题响应包含id、date、challengeNumber、title、description以及javascript/python两个语言对象每个语言对象又含teststexttestString与challengeFilescontentsfileKey——其中tests即本文前面列出的那 5 组断言字符串。日期处理工具如getUtcMidnight、dateStringToUtcMidnight、getSourceDate位于 api/src/daily-coding-challenge/utils/helpers.ts其中getSourceDate会把任意日期映射回 2025-08-11 至 2026-08-10 的原始挑战周期2 月 29 日的请求会回退到 2 月 28 日。前端入口client/src/components/daily-coding-challenge/widget.tsx在课程地图上渲染今日每日挑战入口跳转到/learn/daily-coding-challenge/MM-DD与历史挑战归档入口数据校验使用 Joi 定义在 client/src/utils/daily-coding-challenge-validator.ts。小结Challenge 221 Inverted Matrix 是一道典型的小题目、多考点数组操作题它要求你同时处理矩阵遍历、去重取值与条件替换三类问题。官方解法用Set 双重map在O(m×n)时间内优雅地解决了全部 5 组测试用例其核心是先通过flatSet自动发现两个目标值再以val1为基准做三元互换从而避免硬编码具体值无论是字符串、整数还是浮点数。如果你想继续深入这套体系可以按顺序阅读题目原文curriculum/challenges/english/blocks/daily-coding-challenges-javascript/699c8e045ee7cb94ed2322dc.md挑战块编排curriculum/structure/blocks/daily-coding-challenges-javascript.jsonJS/Python 一致性测试curriculum/src/test/daily-challenges.test.jsAPI 路由实现api/src/daily-coding-challenge/routes/daily-coding-challenge.ts数据校验与日期工具api/src/daily-coding-challenge/schemas/daily-coding-challenge.ts 与 api/src/daily-coding-challenge/utils/helpers.ts前端入口组件client/src/components/daily-coding-challenge/widget.tsx【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价