算法分析-二叉树展开为链表
今天继续研究算法:二叉树展开为链表 给你二叉树的根结点 ,请你将它展开为一个单链表:展开后的单链表应该同样使用 ,其中 子指针指向链表中下一个结点,而左子指针始终为 。展开后的单链表应该与二叉树 顺序相同。 进阶:你可以使用原地算法(O(1) 额外空间)展开这棵树吗? 看到这个题我的头就开始痛了,因为好久没接触树了,连遍历方法都忘得一干二净了,不过既然遇到了那就把它解决掉,长痛不如短痛。 先捡一下…
今天继续研究算法:二叉树展开为链表 给你二叉树的根结点 ,请你将它展开为一个单链表:展开后的单链表应该同样使用 ,其中 子指针指向链表中下一个结点,而左子指针始终为 。展开后的单链表应该与二叉树 顺序相同。 进阶:你可以使用原地算法(O(1) 额外空间)展开这棵树吗? 看到这个题我的头就开始痛了,因为好久没接触树了,连遍历方法都忘得一干二净了,不过既然遇到了那就把它解决掉,长痛不如短痛。 先捡一下…
刚做了乘积最大子数组,现在趁热打铁继续研究:最大子数组和 给你一个整数数组 ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 理解上一题之后,再看这道题就简单了。 不用担心负号会直接将结果反转,所以不用记录下最小的值。 只需要当前面的子串之和已经是负数时,就截断子串,由当前值重新开一个子串即可。 光说概念有些抽象,现在我将拆解一个例子来…
继续研究:乘积最大子数组 给你一个整数数组 ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32 位整数。注意,一个只包含一个元素的数组的乘积是这个元素的值。 这个题的关键在于处理 和负数,因为正数连乘只会越乘越大。 子串中有 ,乘积结果就是 。 子串中有奇数个负数,越乘越小;有偶数个负数,负负得正,也会越来越大。 我尝试使…
继续研究:无重复字符的最长子串 给定一个字符串 ,请你找出其中不含有重复字符的最长子串的长度。 首先想到的方法是遍历并将字符压入栈中,遇到已经在栈中存在的元素则记录下栈的长度后清空栈,对字符串中每一个字符都如此操作一遍。 不出我所料,提交时果然超时了。 时间 $O(n^3)$:外层循环 次,内层遍历 最坏 次,每次 要线性扫描栈(最坏 ),三层相乘。空间 $O(n)$。 优化一下。既然清空栈的时候…
今天继续尝试:删除链表的倒数第 N 个结点 给你一个链表,删除链表的倒数第 个结点,并且返回链表的头结点。 我的想法是:使用两个指针,让它们相隔 个节点,然后同时向后移动。当后面的快指针到达链表末尾时,慢指针的位置就是待删节点的前驱。 这里使用哨兵节点的原因是为了方便删除节点,比如 等于链表长度时需要删除头节点,不使用哨兵节点的话无法操作。 使用双指针,一趟扫描完,$O(n)$ 时间 $O(1)$…
继续研究:有效的括号 给定一个只包括 、、、、、 的字符串 ,判断字符串是否有效。 有效字符串需满足:左括号必须用相同类型的右括号闭合,左括号必须以正确的顺序闭合,每个右括号都有一个对应的相同类型的左括号。 这道题我曾经做过几次,思路基本上是用栈后进先出的特性来解决。 遇到左括号,压入栈中。遇到右括号,看与栈顶左括号能否匹配上,能匹配则弹出栈顶;与栈顶不匹配直接返回 。一一匹配完后看栈中是否还有剩…
今天尝试:合并 K 个升序链表。 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 思考半天没有头绪,试试暴力解法:遍历链表将所有节点放入一个数组,排序后转成新的链表返回。 比较取巧,利用了 Python 本身的排序。 时间复杂度:$O(N \log N)$, 是所有节点总数。空间:$O(N)$( 数组)。 这里并没用到"每条链表本身已经有序"这…
今天研究:字母异位词分组 给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。 读题发现,就是说两个词的字母相同,但是顺序不同,一个词可以通过调整字母顺序变成另一个词,这两个就是字母异位词。 理论上来说,遍历一遍数组,将元素一个个归类就行,难点在于如何知道两个词是异位词。 我首先的想法是将字符串排序,异位词经过排序后就变成了相同的词。然后将排序后的字符串作为 放到字典中归类…
今天尝试:数组中的第 K 个最大元素。 给定整数数组 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。你必须设计并实现时间复杂度为 $O(n) $的算法解决此问题。 第一眼没认真读题——返回数组第 k 大的,那不就是排序后直接返回 不就行了。 提交通过,正好奇这个题为什么这么简单,仔细看题发现要求时间复杂度为 $O(n…
周六 阴 这一周过得真慢,终于到周六了。自从上周没钓到鱼之后,潜心学习了一周的钓技,今天终于可以实操了。 昨天下班就收拾好装备,定好五点闹钟,今天早上准时起床直接出发了。天刚蒙蒙亮,环卫工人已经开始工作,早餐店也才刚打开门准备营业。 六点左右到达百花湖钓鱼点,有钓友夜钓结束刚收杆准备回去,有的也才不久到刚摆好装备。 坐下直接找组装好杆子直接找水深,剪铅皮,调四钓二。调好飘之后才发现有钓鱼的感觉了,…
周三 晴 今天终于把《凡人修仙传》看完了。 很久没有看玄幻小说了,现在读完一本,切身体会到了终不似少年游。初中那会没有智能手机,好在基本上都有电子书的功能。以前使用一个手机和电池都不匹配的破手机看小说都看得津津有味,能够完全沉浸在玄幻的世界中。夜幕降临是我最喜欢的时光了,不用受外界干扰,在被窝里闭关修仙。即使是高中和大学,小说都陪伴我走过很长一段路。 还记得我看的第一本小说是我吃西红柿的《盘龙》,…
周四 阴 今天下午公司组织看电影,广电出品的《四渡》,因为我们是集团下的子公司,所以全员都去观看。 我特别在意其中的一个细节:毛泽东问周恩来蒋介石是怎样的一个人,周恩来说蒋介石无论多忙都会抽出时间来写日记,记录一天所感,二十年来从不间断。能把一件小事坚持这么久的人,是一个可怕的对手。 前几天我在下班路上听播客知行小酒馆的时候,有一期说的是一个女人在从怀上孩子的时候一直写日记记录自己,直到离世。细节…
我接触对话型AI比较早,好几年前就开始使用ChatGPT了。但是对AI Agent的使用相对较晚,前不久Open Claw大火的时候才开始接触这个概念。 关于大模型的话,Deepseek刚开源的时候在自己电脑上部署过v1的版本。由于硬件的限制,体验很差,就没有深入的研究。 最开始是使用Cursor,感觉很不错。以前使用ChatGPT来写代码的时候。做的最多的事情就是不断的复制粘贴。现在很方便,它能…
当一个人又写接口又写前端的时候,最大的痛苦莫过于接口改动后还要修改前端项目并重新部署。 以前在项目少、接口不多的时候还没有感觉。现在项目多了之后,改动一个接口就要去使用这个接口的前端项目挨个改。尤其是加了TS之后,还要手动维护类型标注,头更痛了。 我司使用的是YAPI,研究一下发现太重了,并且配置复杂。我找到了一个更轻量、配置更少的解决方案: Ovral。 我的JAVA项目一开始就配置有swagg…
之前我Github Action的workflows部署Nextjs项目的流程是这样的:控制服务器拉取代码,打包、构建镜像并运行。 由于打包代码后构建镜像都在我2核2G的服务器上,导致执行这个流程的时候服务器上的其他应用卡顿,有时候甚至会导致服务器卡死。 思索之下决定优化我的部署流程,采用在Github Action打包和构建镜像,服务器直接拉取镜像并运行的方式,大大减轻了我服务器压力。 这个方法…
最近正在优化我的博客项目,想好好摆弄一下服务端渲染和SEO优化等。多方研究下最终拍板决定使用Next.js重构我的Vue博客。 一开始我以为会很简单,但实际操作下来仿佛发现了新世界。 从代码架构到部署流程,完全是另外的一套体系。尤其是部署方式,不再是我熟悉的那种“前端打包 - 上传 dist - Nginx 托管静态文件”流程。 现在,我将带大家回顾一下我的项目迁移过程。记录一下 Next 项目与…
数据库文件就备份在服务器上始终还是不太放心,想到直接做图床用的是阿里云的对象存储,今天折腾一下,把数据库备份也上传到OSS。 备份流程其实挺简单,首先写一个脚本,核心是使用mysqldump将数据备份出来并压缩成一个压缩包,并且删除掉7天前的备份。然后创建一个定时任务,每天凌晨三点自动运行一下这个脚本。而oss的作用就是在备份成功后将打包好的压缩包上传到阿里云oss,这样即使服务器数据全部丢失,我…
在我的两核两G服务器无数次卡死重启之后,我终于发现了个好东西:Swap。 Swap是什么? Swap 是 “内存不够时的备用仓库(硬盘当内存用)” 正常情况下,程序都在内存中运行。但如果内存不够了,系统就会把一部分“不常用的数据”挪到硬盘上,这个硬盘空间就叫 Swap(交换空间) 如果你加了 swap,内存满的时候,系统不会立刻杀程序,而是先把数据挪到 swap 虽然会变慢,但服务还能活着。 应该…
官网:[链接] 服务器配置2核2G即可 安装nodejs和npm: 安装openclaw: 启动:,随后根据引导一步步配置即可。 <br / 启动成功后,服务运行在18789端口上,但是不能公网访问。 需要采用SSH 隧道的方式,在本地执行 → 不执行命令,只转发端口 → 本地 18789 端口映射到服务器 127.0.0.1:18789 最后本地访问[链接]即可。 若想不输入密码,只需将本地的公…
折腾了一下网站的字体。 第一次用心仪的字体时采用的是霞鹜文楷。 那时候还不太懂这个问题,直接把十多mb的ttf文件扔到网站上了,体验可想而知有多差。后面放弃了,很长时间没有再用字体。 前两天偶然在别人的博客上看到这个原侠正楷的字体,感觉阅读文章时很舒服,所以决心还是折腾一下。 大概思路是将原文件ttf子集化(只取自己用到的字,去除一些不常用的生僻字),然后转换成woff2格式。在网上能找到很多种方…
在句子用作谓语的动词,最普通、最常见的动词,用作句子中的谓语。谓语动词和中文中不同,它能够根据不同的状态表示出动作的时、体、气 (即动作发生的时间、动作的状态:已完成还是正在进行、动作的假设和情感等) &x20;谓语动词主要分为五大类,也对应着英语中的五大句型: 1. 无需动作承受者的谓语动词: The rabbit slept. (这里的slept因为没有宾语,所以也称为不及物动词。后面的2\4…

2025年7月30日晚,暴雨。 雨夜一如既往的让人转眼七月也快过去,马上到八月,还有两个月的时间准备订婚和结婚的相关事宜。 这个月的主题是:炒股和健身。 股票就不多说了,有得有失,具体的都在股票复盘记录中有写,除金钱上的盈亏外也从股市中的波动中悟到了很多人生道理。 健身已约有半个月了,除了刚开始练伤了休息了两天,其余时间风雨无阻,至少也需要在跑步机上出一身大汗。保持着健身和减脂餐,体重体态虽无大的…
这是极度想搞钱且付诸了行动的一个月。 首先是学习上,上个月花时间系统的对Typescript进行了学习,这个月也将React官方文档过了一遍。 其次是投资,上周开通了股票账户至今已经炒股了3天。前两日运气好赚了一点,第三天也就是周五亏损。目前战况是盈利了约20元。 然后是副业,在小红书上连续一周进行了每日一次的发文。内容是推荐书籍、影视、音乐。没有涨粉,点赞人数加起来也就一手之数。 这个月对于Re…
今天阅读了一下《穷爸爸富爸爸》。才看了第一章就深深被触动了。这本书讲得非常通俗易懂,让我明白“为钱工作”还是“让钱为我工作”两种观念之间的鸿沟般的差距。结合这几年打工的状况,我被深深的带入了其中。 触动之下,我在东方财富开了个股票账户。虽然身边人好像都在用同花顺,但是它的账户要到券商开户,没有自己的券商,让我难以选择。加之我在东方财富旗下的天天基金买过几年的基金,App也很好用,所以就选择了东方财…
最近在专研 React 文档,遇到文档中这样的一句话让我陷入了沉思:“在组件主体中声明的所有变量都是响应式的。” 基于 Vue,我对响应式的理解是这样的:响应式变量是被 Vue 的响应式系统(基于 Proxy)追踪的,只要它们发生变化,Vue 就会自动更新视图。比如通过 ref() 或 reactive() 创建的对象,计算属性 computed,甚至是 watchEffect() 等副作用监听器…
有些组件可能需要控制和同步 React 之外的系统。例如,你可能需要使用浏览器 API 聚焦输入框,或者在没有 React 的情况下实现视频播放器,或者连接并监听远程服务器的消息。在本章中,你将学习到一些脱围机制,让你可以“走出” React 并连接到外部系统。大多数应用逻辑和数据流不应该依赖这些功能。 当你希望组件“记住”某些信息,但又不想让这些信息 触发新的渲染 时,你可以使用 ref 。 u…
Reducer 可以整合组件的状态更新逻辑。Context 可以将信息深入传递给其他组件。你可以组合使用它们来共同管理一个复杂页面的状态。 这里的tasksReducer是我们用于处理tasks的方法,如新增,删除,修改等。 initialTasks是初始化tasks的默认值。 tasks是任务列表、dispatch用于调用tasksReducer来操作tasks。 接下来需要将tasks和dis…
通常来说,你会通过 props 将信息从父组件传递到子组件。但是,如果你必须通过许多中间组件向下传递 props,或是在你应用中的许多组件需要相同的信息,传递 props 会变的十分冗长和不便。Context 允许父组件向其下层无论多深的任何组件提供信息,而无需通过 props 显式传递。 这里的1是默认值 这里需要用useContext来使用LevelContext 注意!这个示例还不能运行。因…
React 控制 UI 的方式是声明式的。你不必直接控制 UI 的各个部分,只需要声明组件可以处于的不同状态,并根据用户的输入在它们之间切换。这与设计师对 UI 的思考方式很相似。 通俗的说就是根据一个状态来判断展示哪一个组件。 React推荐使用尽量简单但是意义明确的state: 1. 如果两个 state 变量总是一起更新,请考虑将它们合并为一个。 2. 仔细选择你的 state 变量,以避免…
state 中可以保存任意类型的 JavaScript 值,包括对象。但是,你不应该直接修改存放在 React state 中的对象。相反,当你想要更新一个对象时,你需要创建一个新的对象(或者将其拷贝一份),然后将 state 更新为此对象。 在 React 中,状态是不可变的(immutable)。React 不会深入比较对象内部的属性变化,而是通过引用是否变化 来判断是否需要更新组件。 Vue…
事件处理函数还将捕获任何来自子组件的事件。通常,我们会说事件会沿着树向上“冒泡”或“传播”:它从事件发生的地方开始,然后沿着树向上传播。 如果你点击任一按钮,它自身的 onClick 将首先执行,然后父级 <div 的 onClick 会接着执行。 在 React 中所有事件都会传播,除了 onScroll,它仅适用于你附加到的 JSX 标签。 事件处理函数接收一个 事件对象 作为唯一的参数。按照…
React 组件是常规的 JavaScript 函数,但 组件的名称必须以大写字母开头,否则它们将无法运行! 在看到标签时,小写为html标签,大写为自己的组件。 返回语句可以全写在一行上,但是,如果你的标签和 return 关键字不在同一行,则必须把它包裹在一对括号中。没有括号包裹的话,任何在 return 下一行的代码都 将被忽略!不过也要注意:()是(),<\</是<\</,括号只是用于包裹…
在上一章我们学习了基础的react语法,现在我们了解一下企业级开发 安装一个构建工具,如 Vite、Parcel 或 rsbuild。这些构建工具提供了打包和运行源代码的功能,提供本地开发的开发服务器,以及部署应用到生产服务器的构建命令。 使用命令npm create vite\@latest,选择React模板,即可创建React应用。 路由决定了当用户访问特定 URL 时显示的内容或页面。你需…