<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>博文 on 郭睿的博客</title><link>https://low-hands.github.io/zh-cn/posts/</link><description>Recent content in 博文 on 郭睿的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sat, 14 Mar 2026 00:16:00 -0800</lastBuildDate><atom:link href="https://low-hands.github.io/zh-cn/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Diffusion LLM paper reading</title><link>https://low-hands.github.io/zh-cn/posts/paper/dllm/</link><pubDate>Sat, 14 Mar 2026 00:16:00 -0800</pubDate><guid>https://low-hands.github.io/zh-cn/posts/paper/dllm/</guid><description>&lt;h1 id="1-residual-context-diffusion-language-models"&gt;1 Residual Context Diffusion Language Models&lt;/h1&gt;
&lt;h2 id="方法"&gt;方法&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;传统dLLM在每轮预测的时候会把没有预测到的位置上的[MASK]直接扔掉，重置为新的空白[MASK]；为了不浪费算力，会选择保留这些废弃的语义，转变成向量用于下一轮预测&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="算法"&gt;算法&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;将模型预测的概率与词向量进行加权求和，生成残差向量：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;$ \Delta_i^{(t_k)} = \sum_{j=1}^V p_{i,j}^{(t_k)} E_{j,:} $&lt;/p&gt;
&lt;p&gt;$E_{j}$是该词的词向量&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;残差向量的权重，来判断这个向量值不值得保留&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;$\alpha_i^{(t_k)} = \frac{-\sum_{j=1}^V p_{i,j}^{(t_k)} \log p_{i,j}^{(t_k)}}{\log V}$&lt;/p&gt;
&lt;p&gt;$\alpha$越大，模型对这个词可能越没把握，越应该保留；如果有把握的词都没有被预测，说明可能不应该继续保留&lt;/p&gt;
&lt;p&gt;$logV$用来把$\alpha$压缩到0-1之间&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;如果位置i的词没有被预测出来，就做残差相加，把残差项加到[MASK]上&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果已经被预测出来了，就是等于该词的词向量&lt;/p&gt;
&lt;p&gt;$\tilde{e}&lt;em&gt;i^{(t_k)} = \begin{cases} (1 - \alpha_i^{(t&lt;/em&gt;{k-1})})E(x_i^{(t_k)}) + \alpha_i^{(t_{k-1})}\Delta_i^{(t_{k-1})}, &amp;amp; \text{if } x_i^{(t_k)} = \text{[MASK]} \ E(x_i^{(t_k)}), &amp;amp; \text{otherwise} \end{cases}$&lt;/p&gt;
&lt;h2 id="训练"&gt;训练&lt;/h2&gt;
&lt;h3 id="1-reference-model-initialization"&gt;1 Reference Model Initialization&lt;/h3&gt;
&lt;p&gt;训练一个$\mathcal{M}_{ref}$，冻结所有参数，用来输出 $p^{(t)}$&lt;/p&gt;
&lt;h3 id="2-residual-aware-target-training"&gt;2 Residual-Aware Target Training&lt;/h3&gt;
&lt;p&gt;训练一个$\mathcal{M}_{target}$，输入为一个带[MASK]的句子&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;通过$\mathcal{M}_{ref}$算出来的概率，算出残差向量的权重$\alpha$&lt;/li&gt;
&lt;li&gt;$ \Delta_i^{(t_k)} = \sum_{j=1}^V p_{i,j}^{(t_k)} E_{j,:} $ 计算词向量，概率由 $\mathcal{M}&lt;em&gt;{ref}$ 得到，词向量来自$\mathcal{M}&lt;/em&gt;{target}$&lt;/li&gt;
&lt;li&gt;计算最终的加权结果作为输入&lt;/li&gt;
&lt;li&gt;输入到$\mathcal{M}&lt;em&gt;{target}$，预测无掩码的原句
损失函数：$\mathcal{L} = \mathbb{E}\left[\frac{1}{t}\sum&lt;/em&gt;{i:m_i=1} -\log P_{\theta_{target}}(x_i^{(0)} | {e_{i&amp;rsquo;}^{(t)}}_{i&amp;rsquo;=1}^b)\right]$&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="推理"&gt;推理&lt;/h2&gt;
&lt;h3 id="1-warm-start"&gt;1 Warm-Start&lt;/h3&gt;
&lt;p&gt;$\mathcal{M}_{ref}$输出第一步的概率分布$p^{(t_0)}$&lt;/p&gt;</description></item><item><title>Encoder-only</title><link>https://low-hands.github.io/zh-cn/posts/internship/llm/llm-architecture/encoder-only/</link><pubDate>Mon, 02 Mar 2026 23:25:00 -0800</pubDate><guid>https://low-hands.github.io/zh-cn/posts/internship/llm/llm-architecture/encoder-only/</guid><description>&lt;h1 id="什么是预训练"&gt;什么是预训练&lt;/h1&gt;
&lt;p&gt;通过自监督（无标注）来初始化神经网络模型参数&lt;/p&gt;
&lt;p&gt;学习一种通用的语言理解能力&lt;/p&gt;
&lt;h1 id="bert"&gt;BERT&lt;/h1&gt;
&lt;h2 id="bert的预训练任务"&gt;BERT的预训练任务&lt;/h2&gt;
&lt;h3 id="masked-language-modeling"&gt;Masked Language Modeling&lt;/h3&gt;
&lt;p&gt;将输入序列中的一部分（15%）token替换掉，然后去预测,让模型去预测这些词是什么。&lt;/p&gt;
&lt;h4 id="8-1-1"&gt;8-1-1&lt;/h4&gt;
&lt;p&gt;80%的词被设为&lt;code&gt;[MASK]&lt;/code&gt;：完形填空，能联系上下文的双向语义&lt;/p&gt;
&lt;p&gt;10%被替换为词表中的任意随机token：模型不知道哪些是随机的，可以提高模型的纠错能力。逼迫模型联系全局语境，根据语境生成预测的词向量。&lt;/p&gt;
&lt;p&gt;10%保持原始token不变：把模型对词的表征拉向真实的表征&lt;/p&gt;
&lt;h4 id="优化目标"&gt;优化目标&lt;/h4&gt;
&lt;p&gt;$$\mathcal{L}&lt;em&gt;{MLM} = - \sum&lt;/em&gt;{i \in m} \log P(x_i | \tilde{X}; \theta)$$
输入的损坏序列为 $\tilde{X}$，被选中的掩码位置集合为 $m$，$\theta$ 为模型参数&lt;/p&gt;
&lt;p&gt;模型预测出第 $i$ 个位置真实单词 $x_i$ 的概率 $P$ 越大，取对数后再加负号得到的损失值 $\mathcal{L}$ 就越小&lt;/p&gt;
&lt;p&gt;也就是说：虽然模型在顶层其实会输出句子中每一个词的预测结果（包括那 85% 没有被选中的正常词），但系统在计算 Loss 时，只挑出那 15% 被选中（无论是变 [MASK]、变随机词还是保持原词）的位置进行计算。 剩下 85% 位置的输出会被直接无视，不参与打分。&lt;/p&gt;
&lt;h3 id="next-sentence-prediction"&gt;Next Sentence Prediction&lt;/h3&gt;
&lt;p&gt;随机抽取句子对（A，B），判断B是不是A的后续句子。增强跨句子理解的能力&lt;/p&gt;
&lt;p&gt;50%真组合，50%假组合&lt;/p&gt;
&lt;h4 id="cls--a--sep--b--sep"&gt;[CLS] + A + [SEP] + B + [SEP]&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;[CLS]&lt;/code&gt;分类符，放在序列首位判断是不是next&lt;/p&gt;
&lt;p&gt;&lt;code&gt;[SEP]&lt;/code&gt;分隔符，分割两个句子&lt;/p&gt;
&lt;h4 id="优化目标-1"&gt;优化目标&lt;/h4&gt;
&lt;p&gt;$$\mathcal{L}_{NSP} = - \left[ y \log \hat{y} + (1-y) \log (1-\hat{y}) \right]$$&lt;/p&gt;</description></item><item><title>Yan:Foundational Interactive Video Generation</title><link>https://low-hands.github.io/zh-cn/posts/paper/yan/</link><pubDate>Mon, 09 Feb 2026 00:16:00 -0800</pubDate><guid>https://low-hands.github.io/zh-cn/posts/paper/yan/</guid><description>&lt;h1 id="abstract"&gt;Abstract&lt;/h1&gt;
&lt;h1 id="introduction"&gt;Introduction&lt;/h1&gt;
&lt;p&gt;第一段主要说igv的应用和缺陷。aigc正在从生成文本和图像到视频合成（synthesis），现在在已经发展到交互视频生成（IGV）。IGV要求动态地对用户输入进行反应，应用范围从虚拟仿真到具身智能。但是当前方法的缺陷在于缺乏高视觉保真度（fidelity）、持续的时间连贯性（coherence）、丰富的交互性（interactivity）。生成的内容也在创建后保持静态，无法实时地适应。（不高清、不连贯、不交互）&lt;/p&gt;
&lt;p&gt;第二段详细讲述现存方法的缺点。GameNGen、PlayGen、MineWorld的视频质量和泛化能力不行；The-Matrix、GameFactory、Matrix-Game缺乏复杂（intricate）的物理仿真，实时性也不好。最重要的是这些方法把交互视频当成固定的内容生成，不支持动态编辑。列出三个核心挑战：&lt;strong&gt;1. 高保真度的实时视觉体验&lt;/strong&gt;；&lt;strong&gt;2. 泛化好，prompt可控的生成&lt;/strong&gt;；&lt;strong&gt;3. 交互过程中动态、交互的编辑以及即时内容的定制&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;高保真（高分辨、细节真实感、时间连贯）的画面&lt;/li&gt;
&lt;li&gt;实时：高帧率的情况下要迅速生成（Latency必须小）；&lt;/li&gt;
&lt;li&gt;泛化能力好&lt;/li&gt;
&lt;li&gt;on-the-fly：不停止运行，在执行的过程中修改&lt;/li&gt;
&lt;li&gt;是能够实时editing的，可以切换风格并且可以交互&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;传统游戏是通过计算产生下一帧的，比如物理引擎用于计算角色在重力作用下会跳高多少cm；通过逻辑计算判断是否会掉下去或者撞墙；通过gpu进行渲染一个像素一个像素地画出画面&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;第三段讲述本文提出的YAN架构。基于的数据集是Yuan_Meng_Star。主要分为三个模块：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;AAA-level Simulation: 利用高压缩、低时延的3D-VAE，结合基于KV-cache的shift-window降噪推理过程，实现1080p/60fps性能&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;3D-VAE:视频压缩包，把高清画面压小，处理起来才快&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;KV-cache: 缓存之前“想过”的信息，只关注正在变化的小window&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Multi-modal Generation: 分层打标(hierarchical captioning)，游戏特有知识注入到视频扩散模型&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;支持文本和图像的多模态&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Multi-granularity Editing: 混合架构显式地将交互力学模拟和视觉渲染解耦(disentangles)，支持在任何时刻对视频进行编辑&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;解耦将玩家的操作动作和画面解耦开&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="related-work"&gt;Related-Work&lt;/h1&gt;
&lt;h2 id="interactive-generative-video"&gt;Interactive Generative Video&lt;/h2&gt;
&lt;p&gt;先前的IGV工作主要分成两部分。第一种是基于游戏的IGV，它把在游戏数据集里学习到的动作控制和结构transfer到开放（open-ended）环境中，它在某些场景下表现出泛化能力，依赖动作标注。但是这一类不是真正逐帧（frame-wise）的交互式。&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;不逐帧: 成块控制的（chunked control），而不是逐帧生成的（每一帧画面基于上一帧画面和当前的动作信号），比如按下一个键执行这个动作的期间按其他键是不起作用的（动作指令被打包了）&lt;/li&gt;
&lt;li&gt;high latency: 高延迟，按下键后画面不会立刻反应（时间太长）&lt;/li&gt;
&lt;li&gt;更注重navigation（导航）而缺乏精确的物理效果&lt;/li&gt;
&lt;li&gt;画质不行&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;第二种是真实世界的世界模型。它可以在受控制的情况下预测未来的帧的内容，但是不是prompt controllable的也无法提供实时的动作响应。&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;无法即时控制&lt;/li&gt;
&lt;li&gt;无法根据prompt修改内容&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id="game-simulation-with-nerual-network"&gt;Game Simulation with Nerual Network&lt;/h2&gt;
&lt;p&gt;传统游戏是代码写死的，这一方面的研究是想让AI通过阅读大量视频学会游戏的逻辑。MarioVGG通过基于文本的action和游戏的第一帧生成游戏视频片段，但是不实时（生成速度比播放速度慢很多）。GameGen、PlayGen、Oasis用Diffusion实现20FPS的游戏模拟（分辨率和帧率都很低）。本作实现60FPS/1080P。&lt;/p&gt;
&lt;h2 id="video-editing"&gt;Video Editing&lt;/h2&gt;
&lt;p&gt;基于diffusion model的视频编辑可以保持时空相干性（spatiotemporal coherence）。但是问题是假设用户输入是非交互式的，不能保证生成的内容可以实时反应用户的操作。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;时空相干性：视频改完后画面不能闪烁，物体形状不能崩塌。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;过去的研究很多都集中在高画质上没有考虑实时编辑。YAN将机制模拟器和视觉渲染解耦（多粒度）。机制模拟器处理物理特性和交互性，文本提示的视觉渲染根据输入的文本处理风格。&lt;/p&gt;
&lt;h1 id="overview"&gt;Overview&lt;/h1&gt;
&lt;p&gt;数据集源于3d游戏环境中的自动采集的交互式视频数据集。系统是端到端的，分为三个模块。&lt;/p&gt;
&lt;h2 id="yan-sim3a级模拟"&gt;Yan-Sim：3A级模拟&lt;/h2&gt;
&lt;p&gt;高画质、实时渲染和物理模拟&lt;/p&gt;
&lt;h2 id="yan-gen-多模态生成"&gt;Yan-Gen： 多模态生成&lt;/h2&gt;
&lt;p&gt;prompt controllable并且可以通过文字或者图像生成视频&lt;/p&gt;
&lt;h2 id="yan-edit-多粒度编辑"&gt;Yan-Edit： 多粒度编辑&lt;/h2&gt;
&lt;p&gt;把交互机制模拟和视觉渲染解耦（stucture and style）&lt;/p&gt;</description></item><item><title>长短期记忆网络 LSTM</title><link>https://low-hands.github.io/zh-cn/posts/transformer/models/lstm/</link><pubDate>Tue, 27 Jan 2026 16:49:00 -0800</pubDate><guid>https://low-hands.github.io/zh-cn/posts/transformer/models/lstm/</guid><description>&lt;h1 id="结构"&gt;结构&lt;/h1&gt;
&lt;p&gt;&lt;img src="structure.png" alt="structure"&gt;
纵向看，每一列相当于一个小的传统神经网络&lt;/p&gt;
&lt;p&gt;x：输入层，长度为word embedding的维度&lt;/p&gt;
&lt;p&gt;U：输入层到隐藏层的权重&lt;/p&gt;
&lt;p&gt;s：隐藏层 = f(U * xt + W * s(t-1) + bias),即输入层的计算结果加上上一时刻的结果乘上一个权重W&lt;/p&gt;
&lt;p&gt;V: 隐藏层到输出层的权重&lt;/p&gt;
&lt;p&gt;o：输出 = softmax(V * st + bias)&lt;/p&gt;
&lt;h1 id="注意"&gt;注意&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;由公式可见，每个隐藏层s的值不仅依赖于当前时刻的输入，而且依赖于&lt;strong&gt;上一个时刻的的结果s(t-1)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;U,V,W都是共享的&lt;/li&gt;
&lt;li&gt;不一定每一个时刻都要有一个输出，也就是说不是每一个小神经网络都必须有输出，它可以是不完整的&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="举例"&gt;举例&lt;/h1&gt;
&lt;p&gt;&lt;img src="8397aaf6-1669-46b3-8465-791ed748404f.png" alt="example"&gt;&lt;/p&gt;
&lt;p&gt;这是一个时间序列做预测的例子，一共有三天的数据，预测明天的数据&lt;/p&gt;
&lt;p&gt;w1 = U = 1.8， w2 = W = -0.5，w3 = V = 1.1&lt;/p&gt;
&lt;p&gt;x0 = 1, x1 = 0.5, x2 = 0.5
这里的输入只是数字而不是向量&lt;/p&gt;
&lt;h2 id="day0"&gt;Day0&lt;/h2&gt;
&lt;p&gt;s0 = f(1.8 * 1 + -0.5 * 0) = f(1.8) = 1.8&lt;/p&gt;</description></item><item><title>循环神经网络 RNN</title><link>https://low-hands.github.io/zh-cn/posts/transformer/models/rnn/</link><pubDate>Mon, 26 Jan 2026 23:57:00 -0800</pubDate><guid>https://low-hands.github.io/zh-cn/posts/transformer/models/rnn/</guid><description>&lt;h2 id="结构"&gt;结构&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://low-hands.github.io/posts/transformer/models/rnn/structure.png" alt="structure"&gt;
纵向看，每一列相当于一个小的传统神经网络&lt;/p&gt;
&lt;p&gt;x：输入层，长度为word embedding的维度&lt;/p&gt;
&lt;p&gt;U：输入层到隐藏层的权重&lt;/p&gt;
&lt;p&gt;s：隐藏层 = f(U * xt + W * s(t-1) + bias),即输入层的计算结果加上上一时刻的结果乘上一个权重W&lt;/p&gt;
&lt;p&gt;V: 隐藏层到输出层的权重&lt;/p&gt;
&lt;p&gt;o：输出 = softmax(V * st + bias)&lt;/p&gt;
&lt;h2 id="注意"&gt;注意&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;由公式可见，每个隐藏层s的值不仅依赖于当前时刻的输入，而且依赖于&lt;strong&gt;上一个时刻的的结果s(t-1)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;U,V,W都是共享的&lt;/li&gt;
&lt;li&gt;不一定每一个时刻都要有一个输出，也就是说不是每一个小神经网络都必须有输出，它可以是不完整的&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="举例"&gt;举例&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://low-hands.github.io/posts/transformer/models/rnn/8397aaf6-1669-46b3-8465-791ed748404f.png" alt="example"&gt;&lt;/p&gt;
&lt;p&gt;这是一个时间序列做预测的例子，一共有三天的数据，预测明天的数据&lt;/p&gt;
&lt;p&gt;w1 = U = 1.8， w2 = W = -0.5，w3 = V = 1.1&lt;/p&gt;
&lt;p&gt;x0 = 1, x1 = 0.5, x2 = 0.5
这里的输入只是数字而不是向量&lt;/p&gt;
&lt;h3 id="day0"&gt;Day0&lt;/h3&gt;
&lt;p&gt;s0 = f(1.8 * 1 + -0.5 * 0) = f(1.8) = 1.8&lt;/p&gt;</description></item><item><title>词嵌入 Word Embedding</title><link>https://low-hands.github.io/zh-cn/posts/transformer/embedding/</link><pubDate>Mon, 26 Jan 2026 22:20:00 -0800</pubDate><guid>https://low-hands.github.io/zh-cn/posts/transformer/embedding/</guid><description>&lt;h2 id="one-hot"&gt;One-hot&lt;/h2&gt;
&lt;p&gt;每个token表示为一个长向量，每个向量的维度为词表的大小，向量中只有一个维度的值为1，一般为该词在词表中的索引&lt;/p&gt;
&lt;h3 id="举例"&gt;举例&lt;/h3&gt;
&lt;p&gt;假设用 one-hot对句子进行表示，对句子分词之后，我们可以得到[&amp;lsquo;我‘，’爱‘，’北京‘，’天安门‘]，可以用one hot（独热编码）对单词进行编码。具体为：&lt;/p&gt;
&lt;p&gt;“我”可以表示为[1,0,0,0]&lt;/p&gt;
&lt;p&gt;&amp;ldquo;爱&amp;quot;可以表示为[0,1,0,0]&lt;/p&gt;
&lt;p&gt;&amp;lsquo;北京&amp;rsquo;可以表示为[0,0,1,0]&lt;/p&gt;
&lt;p&gt;&amp;lsquo;天安门&amp;rsquo;可以表示为[0,0,0,1]&lt;/p&gt;
&lt;h3 id="问题"&gt;问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;one-hot向量之间彼此正交，无法识别每个词之间的关系（无法计算相似度，都为0）&lt;/li&gt;
&lt;li&gt;维度爆炸。维度和词表有关系，模型训练难度增大&lt;/li&gt;
&lt;li&gt;向量稀疏，难以捕捉语义关系，因为数据点分布系数，距离度量失效。而且稀疏矩阵存储效率低&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="词嵌入"&gt;词嵌入&lt;/h2&gt;
&lt;p&gt;词嵌入（Word Embedding）是将人类语言中离散、抽象的文本词汇，通过算法映射为计算机可理解的「连续、稠密的低维实数向量」 的文本表示技术&lt;/p&gt;
&lt;h2 id="分布式表示"&gt;分布式表示&lt;/h2&gt;
&lt;p&gt;词嵌入将词表示为一种分布式的形式。分布式表示是将词转化成一个定长、稠密并且存在语义关系的向量，即分布相似的词，是有相似的语义的&lt;/p&gt;
&lt;h3 id="word2vec"&gt;Word2Vec&lt;/h3&gt;
&lt;p&gt;pending&lt;/p&gt;
&lt;h4 id="cbow"&gt;CBOW&lt;/h4&gt;
&lt;p&gt;pending&lt;/p&gt;
&lt;h4 id="skip-gram"&gt;Skip-gram&lt;/h4&gt;
&lt;p&gt;pending&lt;/p&gt;</description></item><item><title>分词器 Tokenizer</title><link>https://low-hands.github.io/zh-cn/posts/transformer/tokenizer/</link><pubDate>Mon, 26 Jan 2026 22:20:00 -0800</pubDate><guid>https://low-hands.github.io/zh-cn/posts/transformer/tokenizer/</guid><description>&lt;p&gt;pending&lt;/p&gt;</description></item><item><title>Leetcode 541 - 反转字符串II</title><link>https://low-hands.github.io/zh-cn/posts/algorithm/twopointers/leetcode-541-%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2ii/</link><pubDate>Mon, 19 Jan 2026 23:12:00 -0800</pubDate><guid>https://low-hands.github.io/zh-cn/posts/algorithm/twopointers/leetcode-541-%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2ii/</guid><description>&lt;p&gt;&lt;a href="https://leetcode.cn/problems/reverse-string-ii/description/" target="_blank" rel="noopener"&gt;题目链接&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="题目描述"&gt;题目描述&lt;/h2&gt;
&lt;p&gt;给定一个字符串 s 和一个整数 k，从字符串开头算起, 每计数至 2k 个字符，就反转这 2k 个字符中的前 k 个字符。&lt;/p&gt;
&lt;p&gt;如果剩余字符少于 k 个，则将剩余字符全部反转。&lt;/p&gt;
&lt;p&gt;如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。&lt;/p&gt;
&lt;p&gt;示例:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;输入: s = &amp;ldquo;abcdefg&amp;rdquo;, k = 2
输出: &amp;ldquo;bacdfeg&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="思路"&gt;思路&lt;/h2&gt;
&lt;p&gt;我使用的是最简单的思路，即将这条题目理解为局部的反转字符串&lt;/p&gt;
&lt;p&gt;所以一部分代码就是反转字符串，然后外层再嵌套一个选取局部区间的循环即可&lt;/p&gt;
&lt;h3 id="初始化"&gt;初始化&lt;/h3&gt;
&lt;p&gt;反转字符串部分为双指针操作，即相向双指针，左指针为起点，右指针为终点
外层嵌套直接一个&lt;code&gt;for&lt;/code&gt;循环或者&lt;code&gt;while&lt;/code&gt;循环，根据剩余字符的数量分类讨论&lt;/p&gt;
&lt;h3 id="循环条件"&gt;循环条件&lt;/h3&gt;
&lt;p&gt;对反转字符串&lt;code&gt;reverse&lt;/code&gt;，两个指针相遇后循环停止&lt;/p&gt;
&lt;p&gt;外层循环即遍历完整个字符串数组即可，不过步长不为1，而是&lt;code&gt;2*k&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="代码"&gt;代码&lt;/h2&gt;
&lt;h3 id="python"&gt;Python&lt;/h3&gt;
&lt;h4 id="1-简单粗暴"&gt;1. 简单粗暴&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Solution&lt;/span&gt;(object):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;reverseStr&lt;/span&gt;(self, s, k):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; :type s: str
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; :type k: int
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; :rtype: str
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; l &lt;span style="color:#f92672"&gt;=&lt;/span&gt; len(s)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; s &lt;span style="color:#f92672"&gt;=&lt;/span&gt; list(s)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; left &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt;(left&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;l):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(left&lt;span style="color:#f92672"&gt;+&lt;/span&gt;k&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;l&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;reverse(s,left,l &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;reverse(s,left,left&lt;span style="color:#f92672"&gt;+&lt;/span&gt;k &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; left&lt;span style="color:#f92672"&gt;+=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;k
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; s &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;join(s)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;reverse&lt;/span&gt;(self,s,left, right):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt;(left&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;right):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s[left]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; s[left] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s[right]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; s[right] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; x
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; left &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; right &lt;span style="color:#f92672"&gt;-=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="复杂度分析"&gt;复杂度分析&lt;/h5&gt;
&lt;p&gt;时间复杂度： O(n) （尽管是嵌套循环，但是对于外循环中的每个元素，它的&lt;code&gt;reverse&lt;/code&gt;是针对有限个元素left to right的，而不是每个元素都要再循环n次，所以依旧是常数次）&lt;/p&gt;</description></item><item><title>Leetcode 344 - 反转字符串</title><link>https://low-hands.github.io/zh-cn/posts/algorithm/twopointers/leetcode-344-%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2/</link><pubDate>Mon, 19 Jan 2026 12:10:00 -0800</pubDate><guid>https://low-hands.github.io/zh-cn/posts/algorithm/twopointers/leetcode-344-%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2/</guid><description>&lt;p&gt;&lt;a href="https://leetcode.cn/problems/reverse-string/description/" target="_blank" rel="noopener"&gt;题目链接&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="题目描述"&gt;题目描述&lt;/h2&gt;
&lt;p&gt;编写一个函数，其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。&lt;/p&gt;
&lt;p&gt;不要给另外的数组分配额外的空间，你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。&lt;/p&gt;
&lt;p&gt;示例 1：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;输入：s = [&amp;ldquo;h&amp;rdquo;,&amp;ldquo;e&amp;rdquo;,&amp;ldquo;l&amp;rdquo;,&amp;ldquo;l&amp;rdquo;,&amp;ldquo;o&amp;rdquo;]
输出：[&amp;ldquo;o&amp;rdquo;,&amp;ldquo;l&amp;rdquo;,&amp;ldquo;l&amp;rdquo;,&amp;ldquo;e&amp;rdquo;,&amp;ldquo;h&amp;rdquo;]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;示例 2：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;输入：s = [&amp;ldquo;H&amp;rdquo;,&amp;ldquo;a&amp;rdquo;,&amp;ldquo;n&amp;rdquo;,&amp;ldquo;n&amp;rdquo;,&amp;ldquo;a&amp;rdquo;,&amp;ldquo;h&amp;rdquo;]
输出：[&amp;ldquo;h&amp;rdquo;,&amp;ldquo;a&amp;rdquo;,&amp;ldquo;n&amp;rdquo;,&amp;ldquo;n&amp;rdquo;,&amp;ldquo;a&amp;rdquo;,&amp;ldquo;H&amp;rdquo;]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="思路"&gt;思路&lt;/h2&gt;
&lt;p&gt;相向指针：一个指针在起点，一个指针在终点&lt;/p&gt;
&lt;p&gt;两端同时往内收，步长一致，直到两者错过（左大于右），则遍历结束&lt;/p&gt;
&lt;h3 id="初始化"&gt;初始化&lt;/h3&gt;
&lt;p&gt;左指针为起点&lt;code&gt;0&lt;/code&gt;，有指针为终点&lt;code&gt;len(s)-1&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="循环条件"&gt;循环条件&lt;/h3&gt;
&lt;p&gt;当两者相遇后终止循环，如果两者索引相同的时候（数组长度为奇数），该元素可以不进入循环进行交换，所以while可以不包括等号&lt;/p&gt;
&lt;p&gt;包括等号也可以，相当于中间元素与自己完成了一次交换&lt;/p&gt;
&lt;h2 id="代码"&gt;代码&lt;/h2&gt;
&lt;h3 id="python"&gt;Python&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Solution&lt;/span&gt;(object):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;reverseString&lt;/span&gt;(self, s):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; :type s: List[str]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; :rtype: None Do not return anything, modify s in-place instead.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; left &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; right &lt;span style="color:#f92672"&gt;=&lt;/span&gt; len(s) &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; left &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; right:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s[left]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; s[left] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s[right]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; s[right] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; i
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; left &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; right &lt;span style="color:#f92672"&gt;-=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="复杂度分析"&gt;复杂度分析&lt;/h2&gt;
&lt;p&gt;时间复杂度： O(n) （while单循环，单循环内都是常数时间的操作）&lt;/p&gt;</description></item><item><title>Leetcode 27 - 移除元素</title><link>https://low-hands.github.io/zh-cn/posts/algorithm/twopointers/leetcode-27-%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0/</link><pubDate>Sun, 18 Jan 2026 22:21:00 -0800</pubDate><guid>https://low-hands.github.io/zh-cn/posts/algorithm/twopointers/leetcode-27-%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0/</guid><description>&lt;p&gt;&lt;a href="https://leetcode.cn/problems/remove-element/description/" target="_blank" rel="noopener"&gt;题目链接&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="题目描述"&gt;题目描述&lt;/h2&gt;
&lt;p&gt;给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素，并返回移除后数组的新长度&lt;/p&gt;
&lt;p&gt;不要使用额外的数组空间，你必须仅使用 O(1) 额外空间并原地修改输入数组&lt;/p&gt;
&lt;p&gt;元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素&lt;/p&gt;
&lt;p&gt;示例 1: 给定 &lt;code&gt;nums = [3,2,2,3], val = 3&lt;/code&gt;, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素&lt;/p&gt;
&lt;p&gt;示例 2: 给定 &lt;code&gt;nums = [0,1,2,2,3,0,4,2], val = 2&lt;/code&gt;, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4&lt;/p&gt;
&lt;p&gt;你不需要考虑数组中超出新长度后面的元素&lt;/p&gt;
&lt;h2 id="思路"&gt;思路&lt;/h2&gt;
&lt;p&gt;快慢指针：一个快指针，一个慢指针，在一个for循环下完成，比暴力更高效&lt;/p&gt;
&lt;p&gt;快慢指针是同向指针的一种，只是快慢指针的步长一般都是固定的&lt;/p&gt;
&lt;p&gt;慢指针用于存放非&lt;code&gt;val&lt;/code&gt;的元素，快指针用于跳过为&lt;code&gt;val&lt;/code&gt;的元素&lt;/p&gt;
&lt;p&gt;快指针遍历完即代表结束，直接递增即可&lt;/p&gt;
&lt;p&gt;慢指针的增长只依赖于判断当前元素，题目不要求考虑不符合要求的元素部分，所以慢指针需要遇到符合条件的元素（这个需要快指针来帮忙判断）才能+1&lt;/p&gt;
&lt;h3 id="初始化"&gt;初始化&lt;/h3&gt;
&lt;p&gt;快慢指针为同向指针，都初始化为0&lt;/p&gt;
&lt;h3 id="循环条件"&gt;循环条件&lt;/h3&gt;
&lt;p&gt;只需要观察快指针，当快指针遍历整个数组即意味着结束&lt;/p&gt;
&lt;p&gt;当快指针等于数组长度-1的时候是可以进入循环的，因为如果最后一个元素不等于 &lt;code&gt;val&lt;/code&gt;，那么是需要将该元素输入到&lt;code&gt;nums[left]&lt;/code&gt;的，即慢指针仍然是有可能要利用到快指针的值的（此时快指针指向数组最后一个元素）&lt;/p&gt;
&lt;h2 id="代码"&gt;代码&lt;/h2&gt;
&lt;h3 id="python"&gt;Python&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Solution&lt;/span&gt;(object):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;removeElement&lt;/span&gt;(self, nums, val):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; :type nums: List[int]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; :type val: int
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; :rtype: int
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; left &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; right &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; k &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; right &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; len(nums)&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; nums[right] &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; val:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nums[left] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nums[right]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; k&lt;span style="color:#f92672"&gt;+=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; left&lt;span style="color:#f92672"&gt;+=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; right&lt;span style="color:#f92672"&gt;+=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; k
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="复杂度分析"&gt;复杂度分析&lt;/h2&gt;
&lt;p&gt;时间复杂度： O(n) （while单循环，单循环内都是常数时间的操作）&lt;/p&gt;</description></item><item><title>短代码示例</title><link>https://low-hands.github.io/zh-cn/posts/shortcodes/</link><pubDate>Tue, 13 Jan 2026 01:07:25 -0800</pubDate><guid>https://low-hands.github.io/zh-cn/posts/shortcodes/</guid><description>&lt;p&gt;这是一个示例帖子，旨在测试以下内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;默认的主图（Hero Image）。&lt;/li&gt;
&lt;li&gt;不同的短代码（Shortcodes）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="提示框-alert"&gt;提示框 (Alert)&lt;/h2&gt;
&lt;p&gt;本主题支持以下几种提示框。&lt;/p&gt;
&lt;div class="alert success"&gt;
&lt;span&gt;&lt;i data-feather="check-circle"&gt;&lt;/i&gt;&lt;/span&gt;
&lt;span&gt;&lt;strong&gt;这是一个&lt;code&gt;type=&amp;quot;success&amp;quot;&lt;/code&gt; 的例子&lt;/strong&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="alert danger"&gt;
&lt;span&gt;&lt;i data-feather="alert-octagon"&gt;&lt;/i&gt;&lt;/span&gt;
&lt;span&gt;&lt;strong&gt;这是一个 &lt;code&gt;type=&amp;quot;danger&amp;quot;&lt;/code&gt; 的例子&lt;/strong&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="alert warning"&gt;
&lt;span&gt;&lt;i data-feather="alert-triangle"&gt;&lt;/i&gt;&lt;/span&gt;
&lt;span&gt;&lt;strong&gt;这是一个 &lt;code&gt;type=&amp;quot;warning&amp;quot;&lt;/code&gt; 的例子&lt;/strong&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="alert info"&gt;
&lt;span&gt;&lt;i data-feather="info"&gt;&lt;/i&gt;&lt;/span&gt;
&lt;span&gt;&lt;strong&gt;这是一个 &lt;code&gt;type=&amp;quot;info&amp;quot;&lt;/code&gt; 的例子&lt;/strong&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="alert dark"&gt;
&lt;span&gt;&lt;i data-feather="alert-circle"&gt;&lt;/i&gt;&lt;/span&gt;
&lt;span&gt;&lt;strong&gt;这是一个 &lt;code&gt;type=&amp;quot;dark&amp;quot;&lt;/code&gt; 的例子&lt;/strong&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="alert primary"&gt;
&lt;span&gt;&lt;i data-feather="alert-circle"&gt;&lt;/i&gt;&lt;/span&gt;
&lt;span&gt;&lt;strong&gt;这是一个 &lt;code&gt;type=&amp;quot;primary&amp;quot;&lt;/code&gt; 的例子&lt;/strong&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="alert secondary"&gt;
&lt;span&gt;&lt;i data-feather="alert-circle"&gt;&lt;/i&gt;&lt;/span&gt;
&lt;span&gt;&lt;strong&gt;这是一个 &lt;code&gt;type=&amp;quot;secondary&amp;quot;&lt;/code&gt; 的例子&lt;/strong&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;h2 id="图片-image"&gt;图片 (Image)&lt;/h2&gt;
&lt;h4 id="不带任何属性的示例图片"&gt;不带任何属性的示例图片。&lt;/h4&gt;
&lt;img src="https://low-hands.github.io/posts/shortcodes/boat.jpg"
alt="海上的小船"
&gt;
&lt;div style="margin-top: 3rem;"&gt;&lt;/div&gt;
&lt;h4 id="带有-height高度和-width宽度属性的示例图片"&gt;带有 &lt;code&gt;height&lt;/code&gt;（高度）和 &lt;code&gt;width&lt;/code&gt;（宽度）属性的示例图片。&lt;/h4&gt;
&lt;img src="https://low-hands.github.io/posts/shortcodes/boat.jpg"
alt="海上的小船"
width="600"
height="400"
&gt;
&lt;div style="margin-top: 3rem;"&gt;&lt;/div&gt;
&lt;h4 id="带有-height-和-width-属性的居中对齐图片"&gt;带有 &lt;code&gt;height&lt;/code&gt; 和 &lt;code&gt;width&lt;/code&gt; 属性的居中对齐图片。&lt;/h4&gt;
&lt;img src="https://low-hands.github.io/posts/shortcodes/boat.jpg"
alt="海上的小船"
width="600"
height="400"
class="center"
&gt;
&lt;div style="margin-top: 3rem;"&gt;&lt;/div&gt;
&lt;h4 id="带有-float浮动属性的图片"&gt;带有 &lt;code&gt;float&lt;/code&gt;（浮动）属性的图片。&lt;/h4&gt;
&lt;img src="https://low-hands.github.io/posts/shortcodes/boat.jpg"
alt="A boat at the sea"
width="500"
height="200"
style="float: right;"
&gt;
&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras egestas lectus sed leo ultricies ultricies. Praesent tellus risus, eleifend vel efficitur ac, venenatis sit amet sem. Ut ut egestas erat. Fusce ut leo turpis. Morbi consectetur sed lacus vitae vehicula. Cras gravida turpis id eleifend volutpat. Suspendisse nec ipsum eu erat finibus dictum. Morbi volutpat nulla purus, vel maximus ex molestie id. Nullam posuere est urna, at fringilla eros venenatis quis.&lt;/p&gt;</description></item><item><title>Markdown 样例</title><link>https://low-hands.github.io/zh-cn/posts/markdown-sample/</link><pubDate>Tue, 13 Jan 2026 00:43:25 -0800</pubDate><guid>https://low-hands.github.io/zh-cn/posts/markdown-sample/</guid><description>&lt;p&gt;这是一个示例帖子，旨在测试以下内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不同的文章作者。&lt;/li&gt;
&lt;li&gt;目录。&lt;/li&gt;
&lt;li&gt;Markdown 内容渲染。&lt;/li&gt;
&lt;li&gt;数学公式渲染。&lt;/li&gt;
&lt;li&gt;表情符号渲染。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id="markdown-语法渲染"&gt;Markdown 语法渲染&lt;/h1&gt;
&lt;h2 id="标题-headings"&gt;标题 (Headings)&lt;/h2&gt;
&lt;p&gt;以下 HTML &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;—&lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt; 元素代表六个级别的章节标题。&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; 是最高级别，而 &lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt; 是最低级别。&lt;/p&gt;
&lt;h1 id="h1"&gt;H1&lt;/h1&gt;
&lt;h2 id="h2"&gt;H2&lt;/h2&gt;
&lt;h3 id="h3"&gt;H3&lt;/h3&gt;
&lt;h4 id="h4"&gt;H4&lt;/h4&gt;
&lt;h5 id="h5"&gt;H5&lt;/h5&gt;
&lt;h6 id="h6"&gt;H6&lt;/h6&gt;
&lt;h2 id="段落-paragraph"&gt;段落 (Paragraph)&lt;/h2&gt;
&lt;p&gt;Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata tiustia prat.&lt;/p&gt;</description></item></channel></rss>