首页 / 资讯中心 / 文章详情

每日编程英语打卡:三道算法题精讲与单词记忆法

每日编程英语打卡:三道算法题精讲与单词记忆法 ★ FEATURED ARTICLE
Day17了说实话每天都得跟自己的惰性掰扯一番但掰扯完还是老老实实把代码题、翻译和单词这三件事做完了。这套打卡体系是我给自己定的一个“最小可行闭环”从第1天用到现在已经养成了肌肉记忆。这篇就专门聊聊Day17这一天的完整情况包括三道代码题49-51的解题思路、英语翻译怎么拆解、单词用什么办法背以及这一路打卡踩过的坑和调整出来的心得。适合正在自学编程、准备技术面试、或者想培养英语学习习惯的朋友参考不管你是刚开始第1天还是已经在第30天挣扎这里面的内容应该都能用得上。1. 打卡体系是怎么搭起来的1.1 为什么是“代码题 翻译 单词”三块并行很多人在自学期间容易陷入一种状态今天猛学算法明天突然觉得英语不能丢结果算法停了三天后天又觉得项目更重要英语又断了。我第1天到第7天就是这么折腾的最后发现哪儿都没做好还特别挫败。后来我给自己定了一个原则每天只保住三件事其余都是加餐。这三件事就是代码题、英语翻译、单词打卡。为什么选这三块而不是“算法刷题 背八股文 看项目文档”代码题是硬通货不管是应付笔试还是提升逻辑能力每天保持动手很重要英语翻译这块很多人忽视但实际上读英文文档、看先进项目的技术博客甚至后面写英文简历和汇报全都靠它单词打卡是英语能力的地基但又是最容易被放弃的环节所以干脆单独拆出来固定做。Day17这一天的三块内容看起来各管各的实际上有一个隐藏的共同点都是“短周期高回报”的任务。代码题 30 到 60 分钟能完成翻译一段话 20 分钟单词打卡 15 分钟加起来不到两小时且每项都有明确的完成标志。这就解决了“坚持”的大问题因为模糊的任务很难坚持明确的任务才容易坚持。1.2 当日时间片划分与精力分配打卡拼的不是单日爆发力而是可持续性。我的时间分配大致是这样的20:00 - 20:45代码题先自己思考再看参考题解最后复盘20:45 - 21:05英语翻译用手头的英文材料翻译两段对照参考译文21:05 - 21:20单词打卡用记忆卡工具复习旧词 学习新词21:20 - 21:30整理记录把当天的代码思路、翻译难点、遗忘词写进打卡表时间安排上有两个重点。第一代码题放在精力最好的时段因为算法题最吃脑力放在后面容易敷衍第二每块任务之间留 5 分钟缓冲避免前一项拖堂导致后面的任务被动取消。我前几天的崩溃时刻都是因为刷题超时导致翻译和单词没做完然后带着负罪感睡觉第二天就更不想打卡。关于具体时间不用跟我完全一样但建议是“固定时段 固定时长”。大脑很吃习惯如果每天都是晚上八点做同一件事适应成本会越来越低。1.3 用打卡表建立可追踪的反馈打卡如果只是心里想想“我做了”很容易漏也很难量化。我从第 1 天起就建了一张极简表格每行一天记录日期、三道题编号、翻译材料名、单词新旧数量、当日状态和一句话心得。这张表的作用不只是“记录”更准确的说是用可量化的方式还原每天的学习轨迹。比如到了 Day17我翻前两页就能看到 Day16 做的是第几题当时卡在哪儿翻译材料是哪篇单词背到哪一组。这个反馈回路很关键因为人很容易高估或低估自己的进度表格会帮你说实话。如果你也想做自我打卡建议不要用太复杂的工具一张在线表格或一个本地文档都行。重点是当天记录不要隔天补隔天补大概率会漏掉细节漏掉细节就等于无效打卡。2. Day17 三道代码题的解题拆解2.1 第 49 题二叉树最大路径和这一题拿到手时我第一反应是“树上的动态规划”但真动笔时才发现问题没这么简单。题目要求找一条路径使得路径上的节点值之和最大路径可以不经过根节点也可以只包含一个节点并且每条路径经过的节点不能重复。关键点在于路径可以从左子树向上走到某个节点再向下走到右子树形成一个“弓形”。这就不同于常规的从根到叶子的路径。要处理这种弓形就得在递归返回时区分两种状态一种是“经过当前节点并向父节点延伸”的单边最大贡献另一种是“以当前节点为拐点”的完整路径最大和。我的做法是这样的做一个maxGain(node)的递归函数它返回从当前节点向下走能够获得的最大单边贡献值。计算方式就是当前节点的值加上左右子树中较大的那个贡献值如果子树的贡献为负数就干脆不选了当作 0。然后在递归过程中实时更新全局答案maxSum更新逻辑是当前节点值 左子树最大贡献 右子树最大贡献。这个值可能以当前节点为路径拐点串起左右两条边。最后全局最大值就是答案。我写完这个解法之后专门停下来想了想“为什么要把负数贡献当作 0”。这其实对应着“主动舍弃”的思路如果一支子树往上传的路径收益是负的那带上它只会拉低整体结果不如从当前节点重新开始算一条路径。这种思路和现实里砍掉亏损业务、集中精力做优势业务的逻辑一模一样。时间复杂度和空间复杂度都是O(N)N 是节点数。这个复杂度是能接受的因为每个节点最多访问一次递归栈最深也就是树的高度。2.2 第 50 题合并多个有序链表这道题的描述很直接给定多个已经排好序的链表把它们合并成一个新的有序链表。刚看到这道题时我想到的是“如果是合并两个链表”那就是经典的双指针遍历。但现在是多个链表再用双指针就不够看了。多路合并有两个主流思路。第一个是顺序合并先合并第一个和第二个再把结果跟第三个合并循环下去第二个是最小堆法把所有链表的当前头节点放进一个小顶堆每次弹出最小的节点接到结果链表的末尾然后把这个节点所在链表的下一个节点补进堆里。我在 Day17 选择了堆的解法原因很简单顺序合并每次都在和一个“越来越长”的链表做归并总复杂度会被累加得比较高。而堆解法无论有多少个链表核心操作就是入堆和出堆每个节点最多进出堆一次复杂度是O(N log k)其中 N 是所有节点总数k 是链表数量明显更省事。实现时要注意一个细节堆里存的是节点对象需要在自定义比较器中规定按节点的值排序。很多同学第一次写会直接heapq.heappush(heap, node)结果运行时报错说节点对象不支持比较这就是因为没有指定比较规则。Python 里可以用(node.val, index, node)这种三元组入堆加一个自增序号来避免值相同节点比较时报错。这种“多个有序流合并成一个有序流”的思路后面做外部排序、日志归并甚至消息队列合并的时候都能碰到值得当成通用解法记下来。2.3 第 51 题最长递增子序列这一题几乎是动态规划入门必备。给一个无序数组找其中最长的严格递增子序列长度。注意这里不需要连续只要保持相对顺序就行。自己在纸上试一试就能发现直接暴力枚举所有子序列永远是O(2^N)不可行。我首先用最传统的方法做了一遍定义dp[i]表示以第 i 个元素结尾的最长递增子序列长度。遍历到 i 时去看 j 从 0 到 i - 1如果nums[j] nums[i]就用dp[j] 1尝试更新dp[i]。每次取最大值最后取整个 dp 数组的最大值。这个方法用起来很好理解复杂度是O(N^2)。但我还顺手试了一下优化版用“贪心 二分”把复杂度压到O(N log N)。思路是维护一个数组tailstails[i]表示长度为i 1的递增子序列中结尾元素的最小值。遍历原数组每个元素去 tails 里找第一个大于等于它的位置替换掉。这样 tails 始终是递增的可以用二分查找。用这种办法写起来不难难在理解它为什么能得到正确长度。核心是一个贪心思想长度为 L 的递增子序列结尾值越小后面越有机会接上新元素。所以维护“最小结尾值”就等于维持了当前的扩展潜力。这里没法用文字把每一步替换都演示出来但如果自己拿[10, 9, 2, 5, 3, 7, 101, 18]这个例子走一遍 tails 的变化就会非常有感觉。2.4 三道题的横向对比这三道题一个共同点是都是优化问题。最大路径和是找最大收益合并链表是找最优归并策略最长递增子序列是找最优长度。它们也分别对应了三个不同的重要考点题号核心考点关键操作典型复杂度49树上的递归 状态拆分单边贡献与全局最大值分开维护O(N)50堆的应用 / 多路归并优先队列维护当前最小头部O(N log k)51动态规划 / 贪心 二分dp 递推或 tails 替换O(N^2) 或 O(N log N)这里我有一点体会比较深刷题的时候与其把精力放在“我做对了没有”不如放在“这一步为什么要这么做”。就拿第 51 题来说如果不理解 tails 数组的贪心含义下次遇到变形题可能还是会卡。但只要理解了“保留更小的末尾就等于保留更大的可能性”很多同类题都能直接迁移。3. 英语翻译与单词打卡的实操细节3.1 翻译材料怎么选翻译不再是学生时代那种“把一段中文变成英文”的练习我现在的做法是反过来选一篇英文技术文章或英文原版书籍的段落翻译成中文。比如 Day17 这天我翻的是某开源项目文档里关于缓存淘汰策略的那一段。为什么要选技术材料因为技术文档里逻辑关系多、长难句多、专业词汇多翻译一遍等于同时复习了专业知识和语言表达。新手想开始的话我建议从这几个地方下手开源项目的 README 片段、技术博客的前两段、英文书籍的第一章。材料篇幅不用长100 到 150 个单词左右就够了重要的是把每个词都吃透。如果一上来就翻几百词的文章大概率坚持不到第三天。选材还有一个标准是“比自己当前英语水平难一档”。太简单没有进步太难容易劝退。以四六级水平为例刚开始找比自己阅读能力高一丢丢的内容比如美国高中和大学低年级教材段落或者开发文档前言都是不错的选择。3.2 翻译长难句的拆解方法很多人翻译时卡住不是因为单词不认识而是句子结构绕。碰到长句我有一套固定的拆解流程在 Day17 也照做了先找主干把句子里的主语、谓语、宾语框出来先忽略修饰成分。哪怕整句有三四行核心动作通常就一个。再切修饰把定语从句、状语从句、插入语都单独标出来看看它们分别修饰哪个成分。调整语序中文习惯是重点在后面或者按时间顺序英文习惯可能用被动句式翻译时需要调整顺序。查词义确认有些词单独查是“实现”在特定搭配里是“落实”或“承载”要根据上下文判断。举个例子我那天翻的原文里有一个长句大意是“当缓存容量达到上限时系统会根据预设的淘汰规则选择哪些数据项被移除而这个规则的设计需要兼顾命中率与计算开销”。前半句的主干就是“系统选择数据项”后面是伴随情况翻译时把“当……时”提到句首再补上规则设计的背景读起来就顺多了。这套方法练上十天半月之后你再看到长难句就不会下意识紧张了。很多人觉得英语翻译难其实难的不是语言而是把句子结构梳理清楚的定式思维。3.3 单词打卡的高效姿势单词打卡这件事最容易掉进一个坑每天拿起手机打开单词软件看着眼熟就划掉结果第二天全忘了。我在 Day17 用了两个改进办法。第一个办法是分类记忆。我把今天要背的单词按用途分类比如技术词汇、日常词组、学术词。技术词汇单独背因为它们在文档里出现频率非常高别的类别混在一起很容易干扰记忆。第二个办法是造句式记忆不满足于记住“中文意思”而是用这个单词造一个跟技术场景有关的句子哪怕这个句子是瞎编的只要能用出来记忆效果就明显比死记硬背好。另外我还给单词标注了“熟悉程度”认识、模糊、完全不知道。第 17 天的单词打卡里复习了前两天的 15 个词新学 10 个词其中有 3 个属于“模糊”说明需要明天再滚一遍。这里想强调一个反常识的做法没必要一天硬塞 50 个新词重点是每天的“记忆衰减”能被次日复习接住。与其两天背 100 个忘掉 80 个不如两天背 40 个留下 30 个后者看起来慢实际上才是真正有效的速成。单词打卡尽量安排在固定时间我放在晚上因为它不需要烧脑还能给大脑一个“进入收尾状态”的信号。如果放在早上注意别拖太久否则容易把一天的整体节奏打乱。4. 常见问题与心态管理实录4.1 刷题卡住半小时怎么办我第 49 题当天其实也卡了将近二十分钟卡在“递归返回值到底该返回什么”这件事上。当时我想的是全局最大值与递归值之间的关系没理清实际上是对“路径只能走一条直线”和“路径可以在节点处拐弯”这两层关系混在一起了。后来我解决的步骤很简单放下编辑器在纸上画一棵小树把每种情况的值标出来。画完三个节点的小树再画五个节点的中等树思路立刻清晰了。如果你刷题卡住我的建议是优先“画图 举例子”电脑上看代码很容易变成盯着屏幕发呆纸面上推演反而更能帮忙。超过 30 到 40 分钟还卡着就不要继续死磕了直接去看参考题解看懂之后一定要自己重新写一遍闭上书、关掉题解地写。这一步很关键它不是“抄”而是借着别人的思路重塑自己的表达。Day17 我按照这个节奏三道题总共大约花了五十分钟没有一次卡到心态崩盘。4.2 翻译时被词典“惯坏”的问题打卡过程中我发现一个很常见的问题遇到不会的单词就立刻查查完就忘。这本质上是把翻译做成了“查词填空”而不是“理解表达”。我 Day17 的实验是先不看词典把句子按结构拆开凭猜的先翻译出来之后再去查确认哪些猜对了哪些猜错了。猜错的地方往往是最值得记录的。比如某个单词看起来是“消耗”在缓存淘汰的语境里其实对应“移除并释放空间”。这种带着语境的翻译记忆比干巴巴背一个释义有效得多。如果你也经常翻译完转头就忘建议下一个待翻译段落里刻意控制查词次数最多查三次其余靠上下文推。4.3 单词记了又忘的恶性循环这几乎是所有背单词人的共同噩梦。我前 10 天的体验就是背了忘忘了背心态越来越差。后来我看了一个认知科学相关的内容明白了遗忘本身不是失败而是记忆系统在筛选重要信息。你记不住大概率是因为这个单词出现的次数不够或者没有具体的联系场景。我现在的对策有三个一是缩短复习间隔新学的词分别在 24 小时内、3 天后、7 天后各复习一次二是增加出现频率故意在今天翻译的文章里找自己背过的词找不到就自己造句三是把记不住的词单独放进一个“顽固单词袋”每天只看这一小撮直到它们从顽固变成熟悉。这三个方法落地之后Day17 的单词复习正确率已经明显高过第 10 天了。4.4 时间被压缩或者任务冲突时怎么破总会有那么几天加班、聚会、临时有事把晚上的打卡时间挤没了。我以前遇到这种情况就直接跳过结果第二天开始犹豫要不要补一犹豫就断了两三天。后来我定了一条规则当天可以压缩但不可以清零。哪怕只有二十分钟我也只做一道代码题翻译只做一句话单词只复习不新学。这条规则看似简单实际上解决的是“全有或全无”的心理陷阱。真正破坏打卡习惯的不是某天没做而是“没做到位后的自我放弃”。Day17 的完成情况也不是每项都完美翻译第二段词义有偏差但没关系只要记录在案第二天可以针对性调整。打卡的本质不是证明每天都完美而是每天都跟核心目标保持连接。这种节奏保持下来到后面你会有一种很微妙的感觉不是靠意志力逼着自己学而是每天到了时间点手自然会去翻开题集和文档。到了那种状态基本就算把它内化成习惯了。我个人在这些天的打卡里最深的体会是坚持的关键从来不是“鸡血式努力”而是想办法把任务缩小到无论如何都不愿意放弃的地步。三道代码题听起来像是不小的量但拆到每一道只有十几分钟心理负担就减轻了一大半。翻译和单词更不用说了只要选对材料和方式它们甚至能成为一种调剂。如果你也想开始一套类似的每日打卡别贪多先选两到三项最贴近目标的任务固定时间认真记录跑两星期再回看应该能看到一个完全不一样的自己。
阅读完成 · 觉得有帮助?
咨询建站