news 2026/11/2 13:01:34

LeetCode刷题顺序与归纳方法:从算法入门到工程建模

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode刷题顺序与归纳方法:从算法入门到工程建模

1. 为什么“刷题顺序”比“刷了多少题”更能决定算法能力的质变

很多人在LeetCode上卡在“做了300题,面试还是挂”的困局里,不是因为不够努力,而是从第一天起,就默认把刷题当成一场体力劳动——打开网站,随机点开一道题,写完看答案,标记“已刷”,然后继续。我见过太多某高校计算机系的学生,大三暑假前刷了400+题,结果秋招首轮技术面被一道中等难度的链表环检测题卡住15分钟,最后连哈希表解法都没想起来。问题出在哪?不在于“是否刷过”,而在于“是否在正确的时间、以正确的认知结构,接触了正确的题目”。

“leetcode刷题归纳与顺序”这个标题看似平淡,实则直指算法学习中最常被忽视的认知底层逻辑:人的知识建构不是线性堆叠,而是网状生长;而LeetCode题库的天然结构,恰好是一张巨大、精密、可被系统性拆解的认知地图。它不是按难度数字排列的题海,而是由20+核心数据结构、15+经典算法范式、8大问题域(数组/字符串/树/图/动态规划/回溯/贪心/二分)共同编织的立体网络。当你随机刷题,相当于在一张没有坐标的地图上盲目行走——每一步都算数,但永远不知道自己离目的地还有多远。

真正有效的刷题路径,必须同时满足三个刚性条件:
第一,认知负荷可控:新手面对“单调栈+动态规划+状态压缩”的组合题,不是锻炼思维,是摧毁信心。必须确保当前阶段接触的题目,其所需前置知识不超过已掌握内容的15%。
第二,模式识别可沉淀:刷10道独立的双指针题,不如集中刷5道“同构变形题”——比如先做[167. 两数之和 II - 输入有序数组],再做[125. 验证回文串],接着[344. 反转字符串],最后[977. 有序数组的平方]。这四道题表面无关,但内核全是“左右指针向中心收缩”的同一模式。只有在短时间高频重复中,大脑才会把“双指针”从一个解题技巧,固化为一种条件反射式的直觉。
第三,能力跃迁有锚点:每个阶段必须设置明确的“通关检验题”。比如数组模块结束时,必须能不看提示、30分钟内独立写出[42. 接雨水]的单调栈解法;树模块结束时,必须能手推[105. 从前序与中序遍历序列构造二叉树]的递归过程。这些题不是终点,而是你认知结构完成一次重构的“路标”。

所以,“转载,非原创”这个标注反而成了关键提示——它说明这份顺序不是某个人的灵光一现,而是经过大量真实学习者验证、踩坑、迭代后沉淀下来的集体经验结晶。就像学游泳,教练不会让你先跳进深水区扑腾,而是从呼吸、漂浮、打腿开始,每一环节都精准对应身体能力的阶段性突破。算法学习同样如此:顺序不是束缚,而是让每一次敲键盘,都成为认知神经元之间新连接的物理刻痕。

2. 这份刷题顺序的底层设计逻辑:从“解题术”到“建模力”的三级跃迁

市面上常见的刷题计划,大多停留在“按标签分类”或“按难度排序”的初级阶段。而真正经得起实战检验的顺序,必然遵循一条隐性的能力进化主线:从识别题型(What)、到理解范式(How)、再到自主建模(Why)。这份被广泛转载的顺序,正是严格按此三级跃迁设计,且每个阶段都设置了不可绕过的“认知隘口”。

2.1 第一阶段:建立“题型-解法”的强映射(0-100题)

这个阶段的核心任务,不是追求解法最优,而是让大脑形成“看到某类问题特征,立刻弹出对应工具”的肌肉记忆。比如:

  • 当题目出现“子数组”“连续”“最大/最小”等关键词→ 立即触发“滑动窗口”或“前缀和”反射;
  • 当输入是“升序数组”“旋转”“搜索”等组合→ 自动关联“二分查找”的变体意识;
  • 当描述涉及“所有可能”“枚举”“组合”等字眼→ 启动“回溯模板”的调用流程。

这里的关键细节在于:每组5-7道同类型题,必须按“基础→变形→陷阱”的梯度编排。以“二分查找”为例,标准顺序是:

  1. [704. 二分查找](纯模板,建立信心)
  2. [35. 搜索插入位置](返回索引而非值,理解边界含义)
  3. [34. 在排序数组中查找元素的第一个和最后一个位置](左右边界分离,暴露循环不变量本质)
  4. [153. 寻找旋转排序数组中的最小值](打破“有序”前提,训练条件抽象能力)
  5. [4. 寻找两个正序数组的中位数](将二分从“查值”升维到“查位置”,理解“分割点”建模思想)

提示:这个阶段最易犯的错误是过早追求“一行代码解决”。我曾辅导过一位某公司前端工程师,他坚持用Python的bisect模块刷完所有二分题,结果在面试中被要求手写二分时,连while循环的退出条件都写错。工具是结果,不是过程——必须亲手推演至少3次边界情况(left=mid, right=mid-1等),才能把“循环不变量”刻进直觉。

2.2 第二阶段:穿透“解法-范式”的抽象层(100-300题)

当题型识别成为本能,真正的挑战才开始:为什么这道题用DFS而不是BFS?为什么这道DP题的状态定义必须是“以i结尾”,而不是“前i个”?这个阶段要撕开解法表象,触摸算法范式的内核逻辑。典型设计如:

  • 树的遍历模块:不按“前中后序”机械分类,而是按“问题驱动”重组:

    • [104. 二叉树的最大深度](自底向上递归,返回子树高度)
    • [110. 平衡二叉树](同一递归中同时计算高度并判断平衡,理解“信息复用”)
    • [124. 二叉树中的最大路径和](区分“经过根”与“不经过根”,训练状态拆分意识)
    • [236. 二叉树的最近公共祖先](利用后序遍历的“自底向上传播信息”特性,理解DFS的本质价值)
  • 动态规划模块:彻底抛弃“五步法”套路,直击状态定义的哲学:

    • [509. 斐波那契数](一维线性,理解状态转移的因果链)
    • [70. 爬楼梯](同一模型不同解读:“到达第i阶的方法数” vs “以第i阶为结尾的路径数”)
    • [198. 打家劫舍](引入“选择/不选择”的决策维度,状态需包含行为意图)
    • [213. 打家劫舍 II](环形结构破环为链,理解约束条件如何改变状态空间)

注意:这个阶段必须强制自己手写“状态转移方程推导过程”,哪怕最终代码只有一行。我在某实验室带实习生时发现,能清晰写出“dp[i] = max(dp[i-1], dp[i-2]+nums[i])”推导逻辑的人,面对[337. 打家劫舍 III](树形DP)时,平均耗时比只记模板的人少47%。因为前者在构建“问题-状态-转移”的完整逻辑链,后者只是在匹配题干关键词。

2.3 第三阶段:构建“现实-模型”的翻译能力(300+题)

刷到300题后,多数人会陷入“题目都见过,但新题仍不会”的瓶颈。根源在于:真实面试题往往包裹着业务场景外衣(如“用户点击流分析”“库存分配策略”),需要你主动剥离噪声,识别底层模型。这个阶段的顺序设计,刻意制造“认知摩擦”:

  • [200. 岛屿数量] → [695. 岛屿的最大面积] → [1254. 统计封闭岛屿的数量] → [1020. 飞地的数量]
    四道题共享“网格DFS/BFS”内核,但每道题的“有效区域定义”层层加码:从简单连通块,到面积统计,再到“不与边界连通”的逻辑否定,最后到“完全被水包围”的双重约束。这种设计强迫你反复练习“将自然语言需求,精准翻译为图论中的连通性/可达性/边界条件”。

  • [15. 三数之和] → [18. 四数之和] → [454. 四数相加 II]
    表面是数字增加,实则是训练“问题降维”思维:前三数之和用双指针将O(n³)降至O(n²),四数之和若直接套用会超时,必须想到“分治为两个两数之和”,而四数相加II则进一步要求用哈希表将空间换时间。每一步都在锤炼“面对复杂度压力,如何重新组织问题结构”的元能力。

这个阶段没有标准答案,只有持续追问:“如果把题目中的‘数组’换成‘用户订单日志’,‘最大和’换成‘最高转化率路径’,我的解法模型是否依然成立?”——这才是算法工程师与刷题机器的本质分水岭。

3. 被严重低估的“归纳”动作:如何把刷题变成可复用的知识资产

很多人把“归纳”简单理解为“整理错题本”,这是对认知科学的极大误读。真正的归纳,是在解题过程中,实时进行概念解耦、模式抽象、边界校验的三重脑力操作。一份高质量的刷题顺序,其价值不仅在于题目排列,更在于它为每个节点预设了归纳触发点。以下是我在带教某跨平台系统开发团队时,总结出的四大归纳动作,必须嵌入每日刷题流程:

3.1 动作一:解耦“算法”与“数据结构”的责任边界

初学者常混淆“该用什么算法”和“该用什么数据结构”。例如[1. 两数之和],有人执着于优化暴力循环(算法思维),却忽略哈希表才是破局关键(数据结构思维)。归纳时必须强制回答:

  • 这道题的瓶颈在计算逻辑(如需要多次比较/排序)→ 优先考虑算法优化(快排、二分、DP);
  • 还是瓶颈在数据访问效率(如需要O(1)查值、频繁增删)→ 优先考虑数据结构升级(哈希表、堆、跳表)。

实操案例:[215. 数组中的第K个最大元素]

  • 错误归纳:“这是堆排序题” → 陷入实现堆的细节泥潭;
  • 正确归纳:“这是Top-K查询问题,核心诉求是O(1)获取当前最大值,且需支持动态更新” → 立刻锁定“大顶堆”作为数据结构,算法只需关注堆维护逻辑。

经验:每次AC后,用一句话写下“本题不可替代的数据结构是什么?为什么其他结构无法胜任?”——我坚持此习惯两年,面试中遇到[295. 数据流的中位数]时,30秒内就确定用“双堆”方案,因为归纳笔记里早写着:“中位数本质是动态维护两个极值,单数据结构无法同时满足max/min快速获取”。

3.2 动作二:抽象“同构题”的最小变换集

所谓“同构题”,是指解法骨架完全相同,仅参数/约束微调的题目。但多数人刷完[78. 子集]和[90. 子集 II],仍说不清区别本质。高效归纳要求提取“最小变换集”:

题目核心变换对应代码改动认知启示
[78. 子集]无重复元素无去重逻辑回溯树每层节点均有效
[90. 子集 II]输入含重复if i>start and nums[i]==nums[i-1]: continue同层剪枝需固定起始索引
[46. 全排列]元素唯一无visited数组路径去重靠索引控制
[47. 全排列 II]元素含重if visited[i] or (i>0 and nums[i]==nums[i-1] and not visited[i-1])跨层去重需检查前驱状态

这种表格化归纳,比单纯抄题解深刻十倍。它让你看清:所谓“去重”,本质是控制回溯树中“无效分支”的生成时机——是同层禁止(子集II),还是跨层禁止(全排列II)?这个判断,直接决定剪枝条件的书写逻辑。

3.3 动作三:校验“边界条件”的物理意义

算法题的Bug,90%出在边界。但死记硬背“i从0开始”“j<len-1”是低效的。高阶归纳要求为每个边界赋予现实隐喻:

  • 数组下标越界→ 模拟“快递员送错楼层”:nums[i]是第i层的住户,i>=len(nums)就是试图敲不存在的门;
  • 空输入处理→ 类比“无人值守的自动售货机”:[]是没放商品的货道,None是整台机器断电;
  • 整数溢出→ 如同“电子秤超载报警”:2^31-1是秤的最大承重,超过就归零或报错。

以[8. 字符串转换整数 (atoi)]为例,其12条边界规则令人窒息。但归纳时将其转化为场景:

  • “开头空格” → 顾客排队时的等待区;
  • “正负号” → 顾客出示的会员卡(决定后续服务方向);
  • “非数字字符” → 顾客突然插队喊停;
  • “溢出” → 会员积分系统达到上限自动冻结。

当边界条件有了生活映射,记忆和调试效率呈指数级提升。

3.4 动作四:反向构建“命题人思维”

刷题的终极形态,是能预测题目如何被设计出来。归纳时需逆向思考:

  • 如果我要考察“单调栈”,会设计什么业务场景?(如股票价格跨度、建筑轮廓投影)
  • 如果想卡住“二分查找”的理解,会在哪里埋设陷阱?(如旋转数组中搜索,或峰值元素定位)
  • 哪些现实问题天然适配“并查集”?(如社交网络好友关系、岛屿合并、权限继承树)

我曾用此法预判某大厂面试题:提前两周归纳[130. 被围绕的区域]的命题逻辑——“考察DFS/BFS在二维网格中处理‘边界渗透’的能力”,并推演出变体题[1254. 统计封闭岛屿的数量]。结果面试中真遇到后者,因已深度思考过“如何定义封闭”,仅用8分钟就写出最优解。

4. 实战避坑指南:那些毁掉半年努力的“伪勤奋”陷阱

即使拥有完美顺序和严谨归纳,90%的学习者仍会因几个隐蔽陷阱,让努力效果大打折扣。这些不是技术问题,而是认知惯性导致的系统性损耗。以下是我跟踪37位某公司算法岗候选人的实测数据,总结出的四大高危陷阱:

4.1 陷阱一:用“AC率”代替“思维饱和度”评估进度

多数人以“今日AC 5题”为成就,却无视每道题的思维投入质量。实测显示:

  • 快速AC但未思考多种解法的题目,2周后遗忘率高达68%;
  • 花40分钟尝试3种思路(即使未AC),1个月后相关范式调用速度提升2.3倍。

破解方案:强制执行“15分钟原则”

  • 读题后15分钟内无思路 → 立即看题解,但只看“解法概要”,不看代码;
  • 用10分钟手写思路推演(画状态转移图/递归树/双指针移动过程);
  • 最后20分钟对照题解,重点标注“自己卡点”与“题解破局点”的差异。

我曾辅导一位A同学,他坚持此原则刷完50题后,在模拟面试中面对[480. 滑动窗口中位数],虽未AC,但能清晰说出:“这题需要动态维护有序序列,我想到堆但无法处理删除,题解用multiset很巧妙——下次遇到类似需求,优先考虑支持O(logn)增删的有序容器”。

4.2 陷阱二:在“舒适区题型”上无限堆砌,逃避认知冲突

数据显示,73%的刷题者80%时间花在数组/字符串题,而树/图/DP题占比不足15%。原因很简单:数组题调试直观(print看值就行),而树题需画图、图题需建邻接表、DP题需抽象状态——这些都带来即时认知痛苦。

破解方案:“痛苦配额制”

  • 每日刷题中,强制分配30%给“最抗拒题型”;
  • 为此类题单独建文件夹,命名如“树-我的认知黑洞”;
  • 每攻克1题,在文件夹置顶README写一句:“今天,我驯服了______”。

某导师用此法带学生,3个月后该生在[230. 二叉搜索树中第K小的元素]中,首次独立想到“中序遍历的第K个节点即答案”,而非套用堆解法——因为持续直面“树的遍历本质”,让DFS的递归栈帧在脑中形成了具象画面。

4.3 陷阱三:过度依赖“可视化调试工具”,丧失手推能力

现代IDE的调试器太强大,点几下就能看到每层递归的变量值。但算法面试是白板环境,你必须在脑中构建完整的执行流。实测对比:

  • 依赖调试器刷[105. 从前序与中序遍历序列构造二叉树]的学生,白板写代码时平均卡顿4.2次;
  • 坚持手绘递归树(用纸笔标出每次调用的preStart/inStart/preEnd/inEnd)的学生,一次通过率提升至89%。

破解方案:“三色笔手推法”

  • 黑笔:写原始输入(如preorder=[3,9,20,15,7], inorder=[9,3,15,20,7]);
  • 蓝笔:在inorder下划出根节点位置,标出左右子树范围;
  • 红笔:在preorder中标出对应子树的起止索引,并写出递归调用参数。

这个过程强迫你把“索引计算”从自动化操作,还原为可验证的数学推导。

4.4 陷阱四:忽视“语言特性”对算法实现的隐性影响

同一道题,Python用list.pop(0)实现队列,时间复杂度O(n),而Java用LinkedList.poll()是O(1)。很多初学者把超时归咎于“算法不对”,实则是语言特性坑。常见雷区:

场景Python陷阱Java陷阱安全方案
频繁头部删除list.pop(0)O(n)ArrayList.remove(0)O(n)Python用collections.deque,Java用LinkedList
大量字符串拼接s += tO(n²)String +=O(n²)Python用''.join(list),Java用StringBuilder
哈希表键类型list不能作keyArrayList不能作keyPython转tuple,Java用Arrays.toString()

我在某图像处理Demo项目中,曾因Python未用deque导致BFS超时,排查3小时才发现是语言特性问题。从此所有算法实现前,必查《LeetCode各语言性能避坑手册》(开源社区整理)。

5. 从刷题到工程:如何让LeetCode经验真正赋能实际开发

刷题的终极价值,从来不是为了应付面试,而是锻造一种将模糊业务需求,快速翻译为可验证、可扩展、可维护的代码模型的核心能力。这份刷题顺序之所以被广泛转载,正因为它暗含了从“解题者”到“系统设计者”的能力迁移路径。以下是我在参与某跨平台系统开发时,将LeetCode经验落地的真实案例:

5.1 案例一:用“单调栈”思想重构实时告警引擎

业务需求:监控服务器CPU使用率,当连续5分钟超过阈值,触发告警;但若之后10分钟内回落至阈值下,则自动取消告警。

初版实现:用定时任务每分钟查数据库,遍历历史记录判断连续性——响应延迟高,DB压力大。

LeetCode迁移路径:

  • [84. 柱状图中最大的矩形] → 理解“单调栈维护递增序列”的本质是“寻找左侧第一个更小元素”;
  • [42. 接雨水] → 掌握“栈中存储索引,通过比较高度确定凹槽”的建模方法;
  • 迁移思考:将“CPU使用率序列”视为柱状图高度,把“连续超标时段”抽象为“宽度≥5的矩形”,而“自动取消”对应“矩形被更高柱体截断”。

工程实现:

# 伪代码:用单调栈维护“可能构成连续超标段”的起始时间点 alert_stack = [] # 存储(时间戳, 使用率)元组 for timestamp, cpu_usage in real_time_stream: while alert_stack and cpu_usage < alert_stack[-1][1]: start_ts, _ = alert_stack.pop() duration = timestamp - start_ts if duration >= 300: # 5分钟 trigger_alert(start_ts, timestamp) alert_stack.append((timestamp, cpu_usage))

这套方案将DB查询从O(n)降至O(1),告警延迟从分钟级压缩至秒级。关键洞察来自对单调栈“维护潜在解空间”特性的深度理解——它不只是解算法题的工具,更是处理时序数据流的通用范式。

5.2 案例二:用“回溯+剪枝”优化电商推荐系统

业务需求:为用户生成个性化商品组合(如“手机+耳机+保护壳”),要求组合总价在预算内,且品类互补性得分最高。

初版实现:暴力枚举所有组合,过滤超预算项——百万级商品时完全不可行。

LeetCode迁移路径:

  • [39. 组合总和] → 掌握“按品类分组,每组选1件”的树形搜索结构;
  • [40. 组合总和 II] → 理解“同一品类内商品按价格升序,价格超预算即剪枝”的效率逻辑;
  • [78. 子集] → 迁移“组合长度不定,需控制搜索深度”的灵活性。

工程实现:

// 伪代码:品类为树的层级,商品为节点,价格为边权 public void backtrack(List<ItemGroup> groups, int groupIndex, double currentBudget, double currentScore) { if (currentScore > bestScore) bestCombo = new ArrayList<>(currentCombo); if (groupIndex >= groups.size()) return; // 关键剪枝:预估剩余品类最低价格,若超预算则终止 double minRemainingCost = calcMinCost(groups, groupIndex); if (currentBudget < minRemainingCost) return; for (Item item : groups.get(groupIndex).items) { if (item.price <= currentBudget) { currentCombo.add(item); backtrack(groups, groupIndex + 1, currentBudget - item.price, currentScore + item.score); currentCombo.remove(currentCombo.size() - 1); } } }

此方案使推荐生成时间从12秒降至0.8秒,且支持实时调整预算阈值。其内核正是LeetCode回溯题中反复锤炼的“搜索空间剪枝”思维——在工程中,它表现为对业务约束的数学化表达与提前拦截。

5.3 案例三:用“图论建模”解决权限继承冲突

业务需求:某SaaS系统支持多级组织架构,员工A属于部门X,部门X继承集团Y的权限,但A又被显式禁用某权限。需快速判断A是否拥有该权限。

初版实现:逐层向上遍历组织树,缓存每层权限集合——逻辑混乱,难以维护。

LeetCode迁移路径:

  • [207. 课程表] → 理解“有向图检测环”对应“权限继承链是否存在循环依赖”;
  • [210. 课程表 II] → 掌握“拓扑排序”可生成“权限生效优先级序列”;
  • [133. 克隆图] → 迁移“图遍历中处理节点属性”的能力。

工程实现:

  • 将组织架构建模为有向图,边表示“继承关系”;
  • 将权限操作(授予/禁止)建模为节点属性,按拓扑序遍历,后生效的操作覆盖先生效的;
  • 用Kahn算法实现O(V+E)复杂度的权限计算。

这套方案让权限判断从不可预测的递归,变为可验证的图遍历,且天然支持“权限变更影响范围分析”——只需重新计算受影响子图。这正是LeetCode图论题训练出的“将业务实体抽象为图节点、关系抽象为边”的建模直觉。

我在实际项目中发现,真正拉开工程师差距的,从来不是某个冷门算法的实现细节,而是能否在需求评审会上,30秒内判断“这个问题,本质上是图的连通性问题,还是动态规划的状态优化问题”。这份刷题顺序的价值,正在于它用数百道题的密集训练,把这种抽象能力,锻造成无需思考的本能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/2 13:01:21

C++接入OPC DA:OPCClientToolKit编译、COM注册与DCOM远程排查

简介&#xff1a;OPCClientToolKit 是一套面向 C/C 工业自动化开发者的 OPC DA 客户端静态库源码&#xff0c;适合在 Windows 环境下实现本地或远程 OPC 数据访问&#xff0c;也适合希望理解底层通信封装与对象模型的中高级开发者参考&#xff0c;也可用于上位机数据采集联调与…

作者头像 李华
网站建设 2026/11/2 12:59:42

Postman接口加密加签预处理与签名排查实战

接口联调最让人抓头的场景之一&#xff0c;就是对方文档里赫然写着“所有请求参数需加密并签名”。你把参数填进 Postman&#xff0c;点下 Send&#xff0c;返回{"code":"40001","msg":"签名校验失败"}&#xff0c;把参数翻来覆去对了…

作者头像 李华
网站建设 2026/11/2 12:58:52

腔道手术机器人运动感知与控制技术突破

1. 项目概述&#xff1a;这不是科幻电影&#xff0c;而是深圳先进院正在调试的“腔道内灵巧手”“深圳先进院腔道手术机器人运动感知与控制研究取得进展”——这个标题里没有炫目的特效词&#xff0c;没有“全球首发”“颠覆性突破”这类宣传话术&#xff0c;但作为在医疗机器人…

作者头像 李华
网站建设 2026/11/2 12:57:48

IEC 61215-2:2021 光伏组件 MQT 测试项目与判据解读

简介&#xff1a;IEC 61215-2:2021《地面光伏&#xff08;PV&#xff09;组件 设计鉴定和定型 第2部分&#xff1a;试验程序》标准全文PDF&#xff0c;由国际电工委员会发布&#xff0c;面向光伏组件研发、测试认证、质量管理及实验室人员&#xff0c;以及需要对照国际规范开展…

作者头像 李华
网站建设 2026/11/2 12:55:38

微软Copilot重构超级应用:Home、Code、Autopilot三件套全解析

今早刷到微软正式通告&#xff1a;Microsoft Copilot 重构成超级应用&#xff0c;Home、Code、Autopilot 三件套同步上线。说实话&#xff0c;这比我预想的动作要快。以前 Copilot 给人的印象是聊天框里的全能助手&#xff0c;你跟它说一句&#xff0c;它回一段&#xff0c;问得…

作者头像 李华
网站建设 2026/11/2 12:55:28

WorkBuddy 全链路 App 开发实战:从初始化到上架的十六个避坑指南

1. 从零到上线&#xff1a;为什么我选择用 WorkBuddy 走完整个 App 开发链路去年年底我接了一个内部工具类的项目&#xff0c;需求很明确&#xff1a;做一个能在 Android 和 iOS 上跑起来的轻量级应用&#xff0c;核心功能是数据看板加消息推送&#xff0c;团队一共两个人&…

作者头像 李华