<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Xhofe&#39; Blog</title>
  
  
  <link href="https://nn.ci/atom.xml" rel="self"/>
  
  <link href="https://nn.ci/"/>
  <updated>2022-04-08T06:08:00.000Z</updated>
  <id>https://nn.ci/</id>
  
  <author>
    <name>Xhofe</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Golang与Rust交叉编译</title>
    <link href="https://nn.ci/posts/go-rust-cross-compile.html"/>
    <id>https://nn.ci/posts/go-rust-cross-compile.html</id>
    <published>2022-04-08T06:08:00.000Z</published>
    <updated>2022-04-08T06:08:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="交叉编译"><a class="markdownIt-Anchor" href="#交叉编译"></a> 交叉编译</h2><p>交叉编译一般是指在一个平台上生成另一个平台上的可执行代码，因为有一些目标平台性能很弱，编译需要花费很长的时间，所以需要在性能较高的平台上通过交叉编译来得到目标程序。<br />在golang和rust中交叉编译都是很容易实现的。</p><h2 id="golang"><a class="markdownIt-Anchor" href="#golang"></a> Golang</h2><p>golang交叉编译一般不需要额外的工具，只需要在golang编译时指定<code>GOOS</code>（操作系统）和<code>GOARCH</code>（CPU架构）即可。<br />可以使用<code>go tool dist list</code>来查看所有支持的目标平台。<br />但是如果代码中使用了cgo，那么通常还需要指定一个<code>CC</code>（一般为gcc）来进行编译。<br />如果目标平台使用glibc库，可以快捷的使用<a class="link"   href="https://github.com/techknowlogick/xgo" >xgo<i class="fas fa-external-link-alt"></i></a>来进行交叉编译。<br />但是有些目标平台是使用的是musl库，或者是使用其他版本的C库，就需要手动安装交叉编译工具链了。</p><p>通过CC指定<code>musl-gcc</code>之后，编译出来的程序就可以在musl库的目标平台下运行了，但是其他版本的C库又不行了，这里要引入一个新的概念，叫做<code>静态编译</code>，即直接将用到的库链接到目标程序中，这样就不在依赖其他的库了。<br />二进制程序依赖的库可以通过<code>ldd file</code>查看。<br />在golang中，在<code>ldflags</code>中加入<code>--extldflags '-static -fpic'</code>参数即可开启静态编译，这时使用musl编译出来的二进制文件就可以在所有的目标平台运行了，无论使用的是什么C库。</p><blockquote><p>为什么不直接使用glibc来进行静态编译呢？<br />直接使用glibc编译出来的二进制文件用ldd查看也是没有依赖的，但是在musl库系统下就是无法运行，我也不知道为什么。</p></blockquote><h2 id="rust"><a class="markdownIt-Anchor" href="#rust"></a> Rust</h2><p>rust有专门用于交叉编译的库：<a class="link"   href="https://github.com/cross-rs/cross" >cross<i class="fas fa-external-link-alt"></i></a>，使用<code>cross build</code>命令直接指定target他就可以工作了。</p><p>如果需要手动交叉编译，在rust中进行交叉编译通常比golang中多一步，需要使用<code>rustup target add</code>来添加目标target，同样的所有目标target都可以通过<code>rustup target list</code>来查看。<br />然后就是和golang一样需要一个gcc，但是有少数时候又不需要，例如在<code>x86_64-unknown-linux-gnu</code>上编译目标平台为<code>x86_64-unknown-linux-musl</code>的<code>hello-world</code>程序就不需要安装额外的<code>musl-gcc</code>，至于为什么这样，我也不知道。<br />另外Rust可能还需要在<code>.cargo/config</code>中添加一个<code>[target.'x86_64-unknown-linux-gnu'.linker = &quot;xxx&quot;]</code>来指定使用的gcc，编译时也需要加入<code>--target host</code>来指定目标平台。</p><blockquote><p>网上很多文章说需要<code>rustup toolchain install</code>，其实是错误的（我认为）</p></blockquote><h2 id="交叉编译工具链下载"><a class="markdownIt-Anchor" href="#交叉编译工具链下载"></a> 交叉编译工具链下载</h2><ul><li>musl: <a class="link"   href="https://musl.cc/" >https://musl.cc/<i class="fas fa-external-link-alt"></i></a></li><li>gnu: <a class="link"   href="https://gnutoolchains.com/download/" >https://gnutoolchains.com/download/<i class="fas fa-external-link-alt"></i></a></li><li>all: <a class="link"   href="https://toolchains.bootlin.com/" >https://toolchains.bootlin.com/<i class="fas fa-external-link-alt"></i></a></li></ul><h2 id="参考"><a class="markdownIt-Anchor" href="#参考"></a> 参考</h2><ul><li><a class="link"   href="https://github.com/japaric/rust-cross" >https://github.com/japaric/rust-cross<i class="fas fa-external-link-alt"></i></a></li><li><a class="link"   href="https://blog.hcl.moe/archives/2630" >https://blog.hcl.moe/archives/2630<i class="fas fa-external-link-alt"></i></a></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;交叉编译&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#交叉编译&quot;&gt;&lt;/a&gt; 交叉编译&lt;/h2&gt;
&lt;p&gt;交叉编译一般是指在一个平台上生成另一个平台上的可执行代码，因为有一些目标平台性能很弱，编译需要花费很长的时间，所以需要在性能较高的平</summary>
      
    
    
    
    <category term="tutorials" scheme="https://nn.ci/categories/tutorials/"/>
    
    <category term="learning" scheme="https://nn.ci/categories/learning/"/>
    
    
    <category term="go" scheme="https://nn.ci/tags/go/"/>
    
    <category term="rust" scheme="https://nn.ci/tags/rust/"/>
    
  </entry>
  
  <entry>
    <title>Leetcode 440. 字典序的第K小数字</title>
    <link href="https://nn.ci/posts/leetcode-440.html"/>
    <id>https://nn.ci/posts/leetcode-440.html</id>
    <published>2022-03-23T06:08:00.000Z</published>
    <updated>2022-03-23T06:08:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="leetcode-440-字典序的第k小数字-difficulty"><a class="markdownIt-Anchor" href="#leetcode-440-字典序的第k小数字-difficulty"></a> Leetcode <a class="link"   href="https://leetcode-cn.com/problems/k-th-smallest-in-lexicographical-order/" >440. 字典序的第K小数字<i class="fas fa-external-link-alt"></i></a> <img                       lazyload                     src="/images/loading.svg"                     data-src="https://shields.io/badge/-Hard-red"                      alt="Difficulty"                 ></h1><h2 id="题目描述"><a class="markdownIt-Anchor" href="#题目描述"></a> 题目描述：</h2><p>给定整数 <code>n</code> 和 <code>k</code>，返回 <code>[1, n]</code> 中字典序第 <code>k</code> 小的数字。</p><p><strong>示例 1:</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">输入: n = 13, k = 2</span><br><span class="line">输出: 10</span><br><span class="line">解释: 字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9]，所以第二小的数字是 10。</span><br></pre></td></tr></table></figure><p><strong>示例 2:</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">输入: n = 1, k = 1</span><br><span class="line">输出: 1</span><br></pre></td></tr></table></figure><p><strong>提示:</strong></p><ul><li><code>1 &lt;= k &lt;= n &lt;= 109</code></li></ul><h2 id="思路"><a class="markdownIt-Anchor" href="#思路"></a> 思路</h2><p>通过观察字典序的排列可以发现以下规律：</p><ul><li>以i+1开头的字典序肯定大于以i开头的</li><li>i*10 =&gt; 字典序+1</li><li>i+1 =&gt; 字典序+(i+1作为前缀的最小值 - i作为前缀的最小值)</li></ul><p>要找到在[1,n]中第k小的数字，我们肯定需要从以i作为前缀的开始数，首先需要计算出以i为前缀的个数，以i为前缀的个数即：以i+1为前缀的最小值-以i为前缀的最小值，且这些值都必须小于n。</p><p>找到以i为前缀的个数count后，有两种情况：</p><ul><li>k&gt;count，说明以i为前缀的个数不够，还需要继续去找i+1的，k-=count，将i+1；</li><li>k&lt;=count，则说明第k小的数字就是以i开头的，那么通过将i*10将字典序+1，然后重复上面的步骤就可以找出第k小字典序的数字了。</li></ul><h2 id="代码"><a class="markdownIt-Anchor" href="#代码"></a> 代码</h2><figure class="highlight rust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">impl</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">pub</span> <span class="keyword">fn</span> <span class="title function_">find_kth_number</span>(n: <span class="type">i32</span>, k: <span class="type">i32</span>) <span class="punctuation">-&gt;</span> <span class="type">i32</span> &#123;</span><br><span class="line">        <span class="keyword">let</span> (<span class="keyword">mut</span> k, <span class="keyword">mut</span> cur, n) = ((k - <span class="number">1</span>) <span class="keyword">as</span> <span class="type">i64</span>, <span class="number">1</span> <span class="keyword">as</span> <span class="type">i64</span>, n <span class="keyword">as</span> <span class="type">i64</span>);</span><br><span class="line">        <span class="keyword">while</span> k &gt; <span class="number">0</span> &#123;</span><br><span class="line">            <span class="keyword">let</span> (<span class="keyword">mut</span> count, <span class="keyword">mut</span> first, <span class="keyword">mut</span> last) = (<span class="number">0</span>, cur, cur + <span class="number">1</span>);</span><br><span class="line">            <span class="keyword">while</span> first &lt;= n &#123;</span><br><span class="line">                count += last.<span class="title function_ invoke__">min</span>(n + <span class="number">1</span>) - first;</span><br><span class="line">                first *= <span class="number">10</span>;</span><br><span class="line">                last *= <span class="number">10</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> count &lt;= k &#123;</span><br><span class="line">                cur += <span class="number">1</span>;</span><br><span class="line">                k -= count;</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                cur *= <span class="number">10</span>;</span><br><span class="line">                k -= <span class="number">1</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        cur <span class="keyword">as</span> <span class="type">i32</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;leetcode-440-字典序的第k小数字-difficulty&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#leetcode-440-字典序的第k小数字-difficulty&quot;&gt;&lt;/a&gt; Leetcode &lt;a class=&quot;li</summary>
      
    
    
    
    <category term="algorithm" scheme="https://nn.ci/categories/algorithm/"/>
    
    
    <category term="rust" scheme="https://nn.ci/tags/rust/"/>
    
  </entry>
  
  <entry>
    <title>Leetcode 2039. 网络空闲的时刻</title>
    <link href="https://nn.ci/posts/leetcode-2039.html"/>
    <id>https://nn.ci/posts/leetcode-2039.html</id>
    <published>2022-03-22T06:08:00.000Z</published>
    <updated>2022-03-22T06:08:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="leetcode-2039-网络空闲的时刻-difficulty"><a class="markdownIt-Anchor" href="#leetcode-2039-网络空闲的时刻-difficulty"></a> Leetcode <a class="link"   href="https://leetcode-cn.com/problems/the-time-when-the-network-becomes-idle/" >2039. 网络空闲的时刻<i class="fas fa-external-link-alt"></i></a> <img                       lazyload                     src="/images/loading.svg"                     data-src="https://shields.io/badge/-Medium-orange"                      alt="Difficulty"                 ></h1><h2 id="题目描述"><a class="markdownIt-Anchor" href="#题目描述"></a> 题目描述：</h2><p>给你一个有 <code>n</code> 个服务器的计算机网络，服务器编号为 <code>0</code> 到 <code>n - 1</code> 。同时给你一个二维整数数组 <code>edges</code> ，其中 <code>edges[i] = [ui, vi]</code> 表示服务器 <code>ui</code> 和 <code>vi</code> 之间有一条信息线路，在 <strong>一秒</strong> 内它们之间可以传输 <strong>任意</strong> 数目的信息。再给你一个长度为 <code>n</code> 且下标从 <strong>0</strong> 开始的整数数组 <code>patience</code> 。</p><p>题目保证所有服务器都是 <strong>相通</strong> 的，也就是说一个信息从任意服务器出发，都可以通过这些信息线路直接或间接地到达任何其他服务器。</p><p>编号为 <code>0</code> 的服务器是 <strong>主</strong> 服务器，其他服务器为 <strong>数据</strong> 服务器。每个数据服务器都要向主服务器发送信息，并等待回复。信息在服务器之间按 <strong>最优</strong> 线路传输，也就是说每个信息都会以 <strong>最少时间</strong> 到达主服务器。主服务器会处理 <strong>所有</strong> 新到达的信息并 <strong>立即</strong> 按照每条信息来时的路线 <strong>反方向</strong> 发送回复信息。</p><p>在 <code>0</code> 秒的开始，所有数据服务器都会发送各自需要处理的信息。从第 <code>1</code> 秒开始，<strong>每</strong> 一秒最 <strong>开始</strong> 时，每个数据服务器都会检查它是否收到了主服务器的回复信息（包括新发出信息的回复信息）：</p><ul><li>如果还没收到任何回复信息，那么该服务器会周期性 <strong>重发</strong> 信息。数据服务器 <code>i</code> 每 <code>patience[i]</code> 秒都会重发一条信息，也就是说，数据服务器 <code>i</code> 在上一次发送信息给主服务器后的 <code>patience[i]</code> 秒 <strong>后</strong> 会重发一条信息给主服务器。</li><li>否则，该数据服务器 <strong>不会重发</strong> 信息。</li></ul><p>当没有任何信息在线路上传输或者到达某服务器时，该计算机网络变为 <strong>空闲</strong> 状态。</p><p>请返回计算机网络变为 <strong>空闲</strong> 状态的 <strong>最早秒数</strong> 。</p><p><strong>示例 1：</strong></p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="leetcode-2039/quiet-place-example1.png"                      alt="example 1"                 ></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">输入：edges = [[0,1],[1,2]], patience = [0,2,1]</span><br><span class="line">输出：8</span><br><span class="line">解释：</span><br><span class="line">0 秒最开始时，</span><br><span class="line">- 数据服务器 1 给主服务器发出信息（用 1A 表示）。</span><br><span class="line">- 数据服务器 2 给主服务器发出信息（用 2A 表示）。</span><br><span class="line"></span><br><span class="line">1 秒时，</span><br><span class="line">- 信息 1A 到达主服务器，主服务器立刻处理信息 1A 并发出 1A 的回复信息。</span><br><span class="line">- 数据服务器 1 还没收到任何回复。距离上次发出信息过去了 1 秒（1 &lt; patience[1] = 2），所以不会重发信息。</span><br><span class="line">- 数据服务器 2 还没收到任何回复。距离上次发出信息过去了 1 秒（1 == patience[2] = 1），所以它重发一条信息（用 2B 表示）。</span><br><span class="line"></span><br><span class="line">2 秒时，</span><br><span class="line">- 回复信息 1A 到达服务器 1 ，服务器 1 不会再重发信息。</span><br><span class="line">- 信息 2A 到达主服务器，主服务器立刻处理信息 2A 并发出 2A 的回复信息。</span><br><span class="line">- 服务器 2 重发一条信息（用 2C 表示）。</span><br><span class="line">...</span><br><span class="line">4 秒时，</span><br><span class="line">- 回复信息 2A 到达服务器 2 ，服务器 2 不会再重发信息。</span><br><span class="line">...</span><br><span class="line">7 秒时，回复信息 2D 到达服务器 2 。</span><br><span class="line"></span><br><span class="line">从第 8 秒开始，不再有任何信息在服务器之间传输，也不再有信息到达服务器。</span><br><span class="line">所以第 8 秒是网络变空闲的最早时刻。</span><br></pre></td></tr></table></figure><p><strong>示例 2：</strong></p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="leetcode-2039/network_a_quiet_place_2.png"                      alt="example 2"                 ></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">输入：edges = [[0,1],[0,2],[1,2]], patience = [0,10,10]</span><br><span class="line">输出：3</span><br><span class="line">解释：数据服务器 1 和 2 第 2 秒初收到回复信息。</span><br><span class="line">从第 3 秒开始，网络变空闲。</span><br></pre></td></tr></table></figure><p><strong>提示：</strong></p><ul><li><code>n == patience.length</code></li><li><code>2 &lt;= n &lt;= 105</code></li><li><code>patience[0] == 0</code></li><li>对于 <code>1 &lt;= i &lt; n</code> ，满足 <code>1 &lt;= patience[i] &lt;= 105</code></li><li><code>1 &lt;= edges.length &lt;= min(105, n * (n - 1) / 2)</code></li><li><code>edges[i].length == 2</code></li><li><code>0 &lt;= ui, vi &lt; n</code></li><li><code>ui != vi</code></li><li>不会有重边。</li><li>每个服务器都直接或间接与别的服务器相连。</li></ul><h2 id="思路"><a class="markdownIt-Anchor" href="#思路"></a> 思路</h2><p>这里每个服务器最后变的空闲的时间都是相互独立的，所以我们算出每一个服务器接收最后一条消息的时间然后取最大的那一个就行了。</p><p>要计算这个的时间，首先肯定是需要计算每个服务器到服务器0的最短距离，这里刚开始使用的是迪杰斯特拉，但是提交之后超时了，然后观察到所有服务器的距离都是1，所以直接BFS就可以得到距离。</p><p>然后考虑怎么计算每个服务器的接受到最后一条消息的时间，接受最后一条消息的时间=发出最后一条消息的时间+2*服务器距离+1，所以最后需要计算的是最后一条消息发出的时间，如果距离<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">距</mi><mi mathvariant="normal">离</mi><mo>×</mo><mn>2</mn><mo>&lt;</mo><mo>=</mo><mi mathvariant="normal">发</mi><mi mathvariant="normal">送</mi><mi mathvariant="normal">的</mi><mi mathvariant="normal">间</mi><mi mathvariant="normal">隔</mi><mi mathvariant="normal">时</mi><mi mathvariant="normal">间</mi></mrow><annotation encoding="application/x-tex">距离×2&lt;=发送的间隔时间</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">距</span><span class="mord cjk_fallback">离</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.68354em;vertical-align:-0.0391em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0em;vertical-align:0em;"></span><span class="mord cjk_fallback">发</span><span class="mord cjk_fallback">送</span><span class="mord cjk_fallback">的</span><span class="mord cjk_fallback">间</span><span class="mord cjk_fallback">隔</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">间</span></span></span></span>的话，那么最后一条消息就是第一条消息，否则：</p><p>在停止发消息前，经历了<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>2</mn><mo>×</mo><mi mathvariant="normal">距</mi><mi mathvariant="normal">离</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">2×距离-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">距</span><span class="mord cjk_fallback">离</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>的时间，再此期间则会发送<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo fence="false">⌊</mo><mstyle displaystyle="true" scriptlevel="0"><mfrac><mrow><mn>2</mn><mo>×</mo><mi mathvariant="normal">距</mi><mi mathvariant="normal">离</mi><mo>−</mo><mn>1</mn></mrow><mrow><mtext mathvariant="italic">patience</mtext><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo></mrow></mfrac></mstyle><mo fence="false">⌋</mo></mrow><annotation encoding="application/x-tex">\Big\lfloor\dfrac{2 \times 距离- 1}{\textit{patience}[i]}\Big\rfloor</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.25744em;vertical-align:-0.936em;"></span><span class="mord"><span class="delimsizing size2">⌊</span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord textit">patience</span></span><span class="mopen">[</span><span class="mord mathdefault">i</span><span class="mclose">]</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord cjk_fallback">距</span><span class="mord cjk_fallback">离</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="delimsizing size2">⌋</span></span></span></span></span>条消息，那么最后一条消息的时间就是：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo fence="false">⌊</mo><mfrac><mrow><mn>2</mn><mo>×</mo><mi mathvariant="normal">距</mi><mi mathvariant="normal">离</mi><mo>−</mo><mn>1</mn></mrow><mrow><mi>p</mi><mi>a</mi><mi>t</mi><mi>i</mi><mi>e</mi><mi>n</mi><mi>c</mi><mi>e</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo></mrow></mfrac><mo fence="false">⌋</mo><mo>×</mo><mi>p</mi><mi>a</mi><mi>t</mi><mi>i</mi><mi>e</mi><mi>n</mi><mi>c</mi><mi>e</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">\Big\lfloor\dfrac{2 \times 距离- 1}{patience[i]}\Big\rfloor \times patience[i]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.25744em;vertical-align:-0.936em;"></span><span class="mord"><span class="delimsizing size2">⌊</span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">p</span><span class="mord mathdefault">a</span><span class="mord mathdefault">t</span><span class="mord mathdefault">i</span><span class="mord mathdefault">e</span><span class="mord mathdefault">n</span><span class="mord mathdefault">c</span><span class="mord mathdefault">e</span><span class="mopen">[</span><span class="mord mathdefault">i</span><span class="mclose">]</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord cjk_fallback">距</span><span class="mord cjk_fallback">离</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="delimsizing size2">⌋</span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">p</span><span class="mord mathdefault">a</span><span class="mord mathdefault">t</span><span class="mord mathdefault">i</span><span class="mord mathdefault">e</span><span class="mord mathdefault">n</span><span class="mord mathdefault">c</span><span class="mord mathdefault">e</span><span class="mopen">[</span><span class="mord mathdefault">i</span><span class="mclose">]</span></span></span></span></span></p><h2 id="代码"><a class="markdownIt-Anchor" href="#代码"></a> 代码</h2><figure class="highlight rust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">use</span> std::collections::VecDeque;</span><br><span class="line"><span class="keyword">impl</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">pub</span> <span class="keyword">fn</span> <span class="title function_">network_becomes_idle</span>(edges: <span class="type">Vec</span>&lt;<span class="type">Vec</span>&lt;<span class="type">i32</span>&gt;&gt;, patience: <span class="type">Vec</span>&lt;<span class="type">i32</span>&gt;) <span class="punctuation">-&gt;</span> <span class="type">i32</span> &#123;</span><br><span class="line">        <span class="keyword">let</span> <span class="variable">num_point</span> = patience.<span class="title function_ invoke__">len</span>();</span><br><span class="line">        <span class="keyword">let</span> <span class="keyword">mut </span><span class="variable">graph</span> = <span class="built_in">vec!</span>[<span class="built_in">vec!</span>[]; num_point];</span><br><span class="line">        edges.<span class="title function_ invoke__">iter</span>().<span class="title function_ invoke__">for_each</span>(|x| &#123;</span><br><span class="line">            graph[x[<span class="number">0</span>] <span class="keyword">as</span> <span class="type">usize</span>].<span class="title function_ invoke__">push</span>(x[<span class="number">1</span>] <span class="keyword">as</span> <span class="type">usize</span>);</span><br><span class="line">            graph[x[<span class="number">1</span>] <span class="keyword">as</span> <span class="type">usize</span>].<span class="title function_ invoke__">push</span>(x[<span class="number">0</span>] <span class="keyword">as</span> <span class="type">usize</span>);</span><br><span class="line">        &#125;);</span><br><span class="line">        <span class="keyword">let</span> <span class="keyword">mut </span><span class="variable">distance</span> = <span class="built_in">vec!</span>[num_point <span class="keyword">as</span> <span class="type">i32</span>; num_point];</span><br><span class="line">        <span class="keyword">let</span> <span class="keyword">mut </span><span class="variable">visited</span> = <span class="built_in">vec!</span>[<span class="literal">false</span>; num_point];</span><br><span class="line">        visited[<span class="number">0</span>] = <span class="literal">true</span>;</span><br><span class="line">        distance[<span class="number">0</span>] = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">let</span> <span class="keyword">mut </span><span class="variable">queue</span> = VecDeque::<span class="title function_ invoke__">new</span>();</span><br><span class="line">        queue.<span class="title function_ invoke__">push_back</span>(<span class="number">0</span>);</span><br><span class="line">        <span class="keyword">while</span> !queue.<span class="title function_ invoke__">is_empty</span>() &#123;</span><br><span class="line">            <span class="keyword">let</span> <span class="variable">cur</span> = queue.<span class="title function_ invoke__">pop_front</span>().<span class="title function_ invoke__">unwrap</span>();</span><br><span class="line">            graph[cur].<span class="title function_ invoke__">iter</span>().<span class="title function_ invoke__">for_each</span>(|&amp;x| &#123;</span><br><span class="line">                <span class="keyword">if</span> !visited[x] &#123;</span><br><span class="line">                    distance[x] = distance[cur] + <span class="number">1</span>;</span><br><span class="line">                    visited[x] = <span class="literal">true</span>;</span><br><span class="line">                    queue.<span class="title function_ invoke__">push_back</span>(x);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;)</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">let</span> <span class="keyword">mut </span><span class="variable">ans</span> = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> <span class="variable">i</span> <span class="keyword">in</span> <span class="number">1</span>..num_point &#123;</span><br><span class="line">            ans = ans.<span class="title function_ invoke__">max</span>(<span class="number">2</span> * distance[i] + <span class="number">1</span> + <span class="keyword">if</span> distance[i] * <span class="number">2</span> &lt;= patience[i] &#123;</span><br><span class="line">                <span class="number">0</span></span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                <span class="comment">// 计算最后一次消息是什么时候发的</span></span><br><span class="line">                (<span class="number">2</span> * distance[i] - <span class="number">1</span>) / patience[i] * patience[i]</span><br><span class="line">            &#125;)</span><br><span class="line">        &#125;</span><br><span class="line">        ans</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;leetcode-2039-网络空闲的时刻-difficulty&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#leetcode-2039-网络空闲的时刻-difficulty&quot;&gt;&lt;/a&gt; Leetcode &lt;a class=&quot;link</summary>
      
    
    
    
    <category term="algorithm" scheme="https://nn.ci/categories/algorithm/"/>
    
    
    <category term="rust" scheme="https://nn.ci/tags/rust/"/>
    
  </entry>
  
  <entry>
    <title>让hexo支持数学公式和换行</title>
    <link href="https://nn.ci/posts/hexo-katex.html"/>
    <id>https://nn.ci/posts/hexo-katex.html</id>
    <published>2022-03-20T06:08:00.000Z</published>
    <updated>2022-03-20T06:08:00.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="问题"><a class="markdownIt-Anchor" href="#问题"></a> 问题</h3><p>大部分的hexo主题自带的数学公式支持都是使用mathjax，但是这个插件的支持不是很好，有很多的公式无法正常显示。在网上搜索一番后，似乎是因为和markdown语法的冲突，发现很多人都推荐使用<a class="link"   href="https://github.com/CHENXCHEN/hexo-renderer-markdown-it-plus" >hexo-renderer-markdown-it-plus<i class="fas fa-external-link-alt"></i></a>，它使用katex来支持数学公式的渲染但是安装之后又发现另一个问题，公式无法换行，在摸索了很长时间之后，最终发现是katex的版本的问题，然后找到了另一个渲染的库：<a class="link"   href="https://github.com/upupming/hexo-renderer-markdown-it-plus" >@upupming/hexo-renderer-markdown-it-plus<i class="fas fa-external-link-alt"></i></a>。现将使用的过程记录如下：</p><h3 id="解决方法"><a class="markdownIt-Anchor" href="#解决方法"></a> 解决方法</h3><p>首先需要替换默认的markdown渲染器：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm un hexo-renderer-marked --save</span><br><span class="line">npm i @upupming/hexo-renderer-markdown-it-plus --save</span><br></pre></td></tr></table></figure><p>然后需要引入katex的样式文件，这里要注意官方的文档里用的还是0.9.0的老版本同样不支持换行，所以需要改成0.10.2的版本，这里使用字节的cdn：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">link</span> <span class="attr">href</span>=<span class="string">&quot;https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/KaTeX/0.10.2/katex.min.css&quot;</span> <span class="attr">rel</span>=<span class="string">&quot;stylesheet&quot;</span>&gt;</span></span><br></pre></td></tr></table></figure><p>现在就可以随意的书写数学公式了，比如：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>S</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo><mo>=</mo><msup><mrow><mo fence="true">[</mo><msub><mi>l</mi><mi>N</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo><mo fence="true">]</mo></mrow><msub><mi>α</mi><mi>N</mi></msub></msup><munderover><mo>∏</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><msup><mrow><mo fence="true">[</mo><msub><mi>c</mi><mi>j</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo><mo fence="true">]</mo></mrow><msub><mi>β</mi><mi>i</mi></msub></msup><msup><mrow><mo fence="true">[</mo><msub><mi>l</mi><mi>N</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo><mo fence="true">]</mo></mrow><msub><mi>γ</mi><mi>j</mi></msub></msup></mrow><annotation encoding="application/x-tex">S(x,y)=\left[l_N(x,y)\right]^{\alpha_N}\prod_{j=1}^{N}\left[c_j(x,y)\right]^{\beta_i}\left[l_N(x,y)\right]^{\gamma_j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:3.2421130000000007em;vertical-align:-1.4137769999999998em;"></span><span class="minner"><span class="minner"><span class="mopen delimcenter" style="top:0em;">[</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.01968em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.10903em;">N</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mclose delimcenter" style="top:0em;">]</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.804292em;"><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3567071428571427em;margin-left:-0.0037em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight" style="margin-right:0.10903em;">N</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.14329285714285717em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283360000000006em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∏</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.10903em;">N</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4137769999999998em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner"><span class="minner"><span class="mopen delimcenter" style="top:0em;">[</span><span class="mord"><span class="mord mathdefault">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mclose delimcenter" style="top:0em;">]</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9890079999999999em;"><span style="top:-3.2029000000000005em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.05278em;">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3280857142857143em;"><span style="top:-2.357em;margin-left:-0.05278em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner"><span class="minner"><span class="mopen delimcenter" style="top:0em;">[</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.01968em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.10903em;">N</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mclose delimcenter" style="top:0em;">]</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.804292em;"><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.05556em;">γ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3280857142857143em;"><span style="top:-2.357em;margin-left:-0.05556em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2818857142857143em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p><h3 id="拓展"><a class="markdownIt-Anchor" href="#拓展"></a> 拓展</h3><p>这里可能还会有一个问题就是，如果公式很长但是屏幕又很窄，公式就有可能超出屏幕，让主题变得很难看，可以添加一个css来改进这个问题：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.katex-display</span> &#123;</span><br><span class="line">  <span class="attribute">overflow-x</span>: auto;</span><br><span class="line">  <span class="attribute">overflow-y</span>: clip;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;问题&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#问题&quot;&gt;&lt;/a&gt; 问题&lt;/h3&gt;
&lt;p&gt;大部分的hexo主题自带的数学公式支持都是使用mathjax，但是这个插件的支持不是很好，有很多的公式无法正常显示。在网上搜索一番后，似乎是因为</summary>
      
    
    
    
    <category term="tutorials" scheme="https://nn.ci/categories/tutorials/"/>
    
    
    <category term="hexo" scheme="https://nn.ci/tags/hexo/"/>
    
  </entry>
  
  <entry>
    <title>Leetcode 798. 得分最高的最小轮调</title>
    <link href="https://nn.ci/posts/leetcode-798.html"/>
    <id>https://nn.ci/posts/leetcode-798.html</id>
    <published>2022-03-11T06:08:00.000Z</published>
    <updated>2022-03-11T06:08:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="leetcode-798-得分最高的最小轮调-difficulty"><a class="markdownIt-Anchor" href="#leetcode-798-得分最高的最小轮调-difficulty"></a> Leetcode 798. <a class="link"   href="https://leetcode-cn.com/problems/smallest-rotation-with-highest-score/" >得分最高的最小轮调<i class="fas fa-external-link-alt"></i></a> <img                       lazyload                     src="/images/loading.svg"                     data-src="https://shields.io/badge/-Hard-red"                      alt="Difficulty"                 ></h1><h2 id="题目描述"><a class="markdownIt-Anchor" href="#题目描述"></a> 题目描述：</h2><p>给你一个数组 <code>nums</code>，我们可以将它按一个非负整数 <code>k</code> 进行轮调，这样可以使数组变为 <code>[nums[k], nums[k + 1], ... nums[nums.length - 1], nums[0], nums[1], ..., nums[k-1]]</code> 的形式。此后，任何值小于或等于其索引的项都可以记作一分。</p><ul><li>例如，数组为 <code>nums = [2,4,1,3,0]</code>，我们按 <code>k = 2</code> 进行轮调后，它将变成 <code>[1,3,0,2,4]</code>。这将记为 <code>3</code> 分，因为 <code>1 &gt; 0</code> [不计分]、<code>3 &gt; 1</code> [不计分]、<code>0 &lt;= 2</code> [计 1 分]、<code>2 &lt;= 3</code> [计 1 分]，<code>4 &lt;= 4</code> [计 1 分]。</li></ul><p>在所有可能的轮调中，返回我们所能得到的最高分数对应的轮调下标 <code>k</code> 。如果有多个答案，返回满足条件的最小的下标 <code>k</code> 。</p><p><strong>示例 1：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">输入：nums = [2,3,1,4,0]</span><br><span class="line">输出：3</span><br><span class="line">解释：</span><br><span class="line">下面列出了每个 k 的得分：</span><br><span class="line">k = 0,  nums = [2,3,1,4,0],    score 2</span><br><span class="line">k = 1,  nums = [3,1,4,0,2],    score 3</span><br><span class="line">k = 2,  nums = [1,4,0,2,3],    score 3</span><br><span class="line">k = 3,  nums = [4,0,2,3,1],    score 4</span><br><span class="line">k = 4,  nums = [0,2,3,1,4],    score 3</span><br><span class="line">所以我们应当选择 k = 3，得分最高。</span><br></pre></td></tr></table></figure><p><strong>示例 2：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">输入：nums = [1,3,0,2,4]</span><br><span class="line">输出：0</span><br><span class="line">解释：</span><br><span class="line">nums 无论怎么变化总是有 3 分。</span><br><span class="line">所以我们将选择最小的 k，即 0。</span><br></pre></td></tr></table></figure><p><strong>提示：</strong></p><ul><li><code>1 &lt;= nums.length &lt;= 10^5</code></li><li><code>0 &lt;= nums[i] &lt; nums.length</code></li></ul><h2 id="思路"><a class="markdownIt-Anchor" href="#思路"></a> 思路</h2><p>首先的思路当然是暴力求解，直接遍历K在0到<code>nums.length</code>这个范围内的所有得分，然后取得分最高的k值（若有多个取较小的k）即可，这样写思路很清晰代码也是比较简单的，但是这道题目的数据量是<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1</mn><msup><mn>0</mn><mn>5</mn></msup></mrow><annotation encoding="application/x-tex">10^5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">5</span></span></span></span></span></span></span></span></span></span></span>，这样做的时间复杂度是<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>N</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(N^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.064108em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>，肯定是会超时的，所以需要去优化。</p><p>首先我们将问题转化，先求出数组中每个值要取得得分时k的范围，假设下标为i，则需要：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi><mi>u</mi><mi>m</mi><msub><mi>s</mi><mi>i</mi></msub><mo>≤</mo><mo stretchy="false">(</mo><mi>i</mi><mo>−</mo><mi>k</mi><mo>+</mo><mi>n</mi><mo stretchy="false">)</mo><mi mathvariant="normal">%</mi><mi>n</mi><mspace linebreak="newline"></mspace><mn>0</mn><mo>≤</mo><mo stretchy="false">(</mo><mi>i</mi><mo>−</mo><mi>k</mi><mo>+</mo><mi>n</mi><mo stretchy="false">)</mo><mi mathvariant="normal">%</mi><mi>n</mi><mo>≤</mo><mi>n</mi><mo>−</mo><mn>1</mn><mspace linebreak="newline"></mspace><mo>⇓</mo><mspace linebreak="newline"></mspace><mi>k</mi><mo>≤</mo><mo stretchy="false">(</mo><mi>i</mi><mo>−</mo><mi>n</mi><mi>u</mi><mi>m</mi><msub><mi>s</mi><mi>i</mi></msub><mo>+</mo><mi>n</mi><mo stretchy="false">)</mo><mspace linebreak="newline"></mspace><mi>k</mi><mo>≤</mo><mo stretchy="false">(</mo><mi>i</mi><mo>+</mo><mi>n</mi><mo stretchy="false">)</mo><mi mathvariant="normal">%</mi><mi>n</mi><mspace linebreak="newline"></mspace><mi>k</mi><mo>≥</mo><mo stretchy="false">(</mo><mi>i</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo><mi mathvariant="normal">%</mi><mi>n</mi></mrow><annotation encoding="application/x-tex">nums_i \leq (i-k+n)\%n \\0 \leq (i-k+n)\%n \leq n-1 \\\Downarrow \\k \leq (i-nums_i+n)\\%n \\k \leq (i+n)\%n \\k \geq (i+1)\%n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7859700000000001em;vertical-align:-0.15em;"></span><span class="mord mathdefault">n</span><span class="mord mathdefault">u</span><span class="mord mathdefault">m</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.77777em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mord">%</span><span class="mord mathdefault">n</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.77777em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mord">%</span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mrel">⇓</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.83041em;vertical-align:-0.13597em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.73333em;vertical-align:-0.15em;"></span><span class="mord mathdefault">n</span><span class="mord mathdefault">u</span><span class="mord mathdefault">m</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">n</span><span class="mclose">)</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.83041em;vertical-align:-0.13597em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mord">%</span><span class="mord mathdefault">n</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.83041em;vertical-align:-0.13597em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mord">%</span><span class="mord mathdefault">n</span></span></span></span></span></p><p>最终得到k的范围为：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>k</mi><mo>∈</mo><mrow><mo fence="true">{</mo><mtable rowspacing="0.24999999999999992em" columnalign="right left right left" columnspacing="0em 1em 0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo stretchy="false">[</mo><mo stretchy="false">(</mo><mi>i</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo><mi mathvariant="normal">%</mi><mi>n</mi><mo separator="true">,</mo><mo stretchy="false">(</mo><mi>i</mi><mo>−</mo><mi>n</mi><mi>u</mi><mi>m</mi><msub><mi>s</mi><mi>i</mi></msub><mo>+</mo><mi>n</mi><mo stretchy="false">)</mo><mi mathvariant="normal">%</mi><mi>n</mi><mo stretchy="false">]</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo stretchy="false">(</mo><mi>i</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo><mi mathvariant="normal">%</mi><mi>n</mi><mo>≤</mo><mo stretchy="false">(</mo><mi>i</mi><mo>−</mo><mi>n</mi><mi>u</mi><mi>m</mi><msub><mi>s</mi><mi>i</mi></msub><mo>+</mo><mi>n</mi><mo stretchy="false">)</mo><mi mathvariant="normal">%</mi><mi>n</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo stretchy="false">[</mo><mn>0</mn><mo separator="true">,</mo><mo stretchy="false">(</mo><mi>i</mi><mo>−</mo><mi>n</mi><mi>u</mi><mi>m</mi><msub><mi>s</mi><mi>i</mi></msub><mo>+</mo><mi>n</mi><mo stretchy="false">)</mo><mi mathvariant="normal">%</mi><mi>n</mi><mo stretchy="false">]</mo><mo>∪</mo><mo stretchy="false">[</mo><mo stretchy="false">(</mo><mi>i</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo><mi mathvariant="normal">%</mi><mi>n</mi><mo separator="true">,</mo><mi>n</mi><mo>−</mo><mn>1</mn><mo stretchy="false">]</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo stretchy="false">(</mo><mi>i</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo><mi mathvariant="normal">%</mi><mi>n</mi><mo>&gt;</mo><mo stretchy="false">(</mo><mi>i</mi><mo>−</mo><mi>n</mi><mi>u</mi><mi>m</mi><msub><mi>s</mi><mi>i</mi></msub><mo>+</mo><mi>n</mi><mo stretchy="false">)</mo><mi mathvariant="normal">%</mi><mi>n</mi></mrow></mstyle></mtd></mtr></mtable></mrow></mrow><annotation encoding="application/x-tex">k \in \left\{\begin{aligned}&amp;\lbrack(i+1)\%n,(i-nums_i+n)\%n\rbrack &amp;&amp; (i+1)\%n \leq (i-nums_i+n)\%n \\&amp;\lbrack0,(i-nums_i+n)\%n\rbrack \cup \lbrack(i+1)\%n, n-1\rbrack &amp;&amp; (i+1)\%n &gt; (i-nums_i+n)\%n \\\end{aligned}\right.</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.73354em;vertical-align:-0.0391em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:3.00003em;vertical-align:-1.25003em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size4">{</span></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7500000000000002em;"><span style="top:-3.75em;"><span class="pstrut" style="height:2.84em;"></span><span class="mord"></span></span><span style="top:-2.25em;"><span class="pstrut" style="height:2.84em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2500000000000002em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7500000000000002em;"><span style="top:-3.91em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mopen">[</span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mord">%</span><span class="mord mathdefault">n</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault">n</span><span class="mord mathdefault">u</span><span class="mord mathdefault">m</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mord">%</span><span class="mord mathdefault">n</span><span class="mclose">]</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mopen">[</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault">n</span><span class="mord mathdefault">u</span><span class="mord mathdefault">m</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mord">%</span><span class="mord mathdefault">n</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∪</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mopen">[</span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mord">%</span><span class="mord mathdefault">n</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mclose">]</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2500000000000002em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:1em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7500000000000002em;"><span style="top:-3.75em;"><span class="pstrut" style="height:2.84em;"></span><span class="mord"></span></span><span style="top:-2.25em;"><span class="pstrut" style="height:2.84em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2500000000000002em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7500000000000002em;"><span style="top:-3.91em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mord">%</span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault">n</span><span class="mord mathdefault">u</span><span class="mord mathdefault">m</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mord">%</span><span class="mord mathdefault">n</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mord">%</span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault">n</span><span class="mord mathdefault">u</span><span class="mord mathdefault">m</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mord">%</span><span class="mord mathdefault">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2500000000000002em;"><span></span></span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>我们就可以在<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span></span></span></span>的时间内求得每项可以得分的k的区间，这样问题就转换为了求k取多少时落在这些区间里最多（k取较小值）？</p><p>然后我们可以这样来求解：先初始化一个长度为n，值为0的数组，然后对于上述的每个区间，将这个数组下标落在区间里的值加一，遍历完之后值最大的那个下标即为得分最高的k值。但是这样做的时间复杂度依然为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.064108em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>，因为有n+个区间，每个区间的长度的数量级也为n，所以这里需要引入一个算法：差分数组</p><h3 id="差分数组"><a class="markdownIt-Anchor" href="#差分数组"></a> 差分数组</h3><p>差分数组就是专门对数组的某个区间进行相同的操作，且时间复杂度为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span></span></span></span>的一个算法，他的本质其实是前缀和的逆操作。步骤如下：</p><p>首先求对应数组的差分数组：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>a</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>a</mi><mn>2</mn></msub><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><msub><mi>a</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo separator="true">,</mo><msub><mi>a</mi><mi>n</mi></msub><mo>⇒</mo><mn>0</mn><mo separator="true">,</mo><msub><mi>a</mi><mn>2</mn></msub><mo>−</mo><msub><mi>a</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>a</mi><mn>3</mn></msub><mo>−</mo><msub><mi>a</mi><mn>2</mn></msub><mo>−</mo><msub><mi>a</mi><mn>1</mn></msub><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msub><mi>a</mi><mi>n</mi></msub><mo>−</mo><msub><mi>a</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>−</mo><msub><mi>a</mi><mrow><mi>n</mi><mo>−</mo><mn>2</mn></mrow></msub><mo>−</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo>−</mo><msub><mi>a</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">a_1,a_2,...a_{n-1},a_n \Rightarrow 0,a_2-a_1,a_3-a_2-a_1,...,a_n-a_{n-1}-a_{n-2}-...-a_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.638891em;vertical-align:-0.208331em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.301108em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.208331em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">⇒</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.7777700000000001em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.73333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.7777700000000001em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.791661em;vertical-align:-0.208331em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.301108em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.208331em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.791661em;vertical-align:-0.208331em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.301108em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.208331em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>就本题来说初始的数组是<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">[</mo><mn>0</mn><mo separator="true">;</mo><mi>n</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[0;n]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord">0</span><span class="mpunct">;</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">n</span><span class="mclose">]</span></span></span></span>，那对应的差分数组仍为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">[</mo><mn>0</mn><mo separator="true">;</mo><mi>n</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[0;n]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord">0</span><span class="mpunct">;</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">n</span><span class="mclose">]</span></span></span></span>；当我们需要对某个区间进行操作时只需要对端点处进行修改，如对<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">[</mo><mi>a</mi><mo separator="true">,</mo><mi>b</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[a,b]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord mathdefault">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">b</span><span class="mclose">]</span></span></span></span>都+1则只需要</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi><mi>u</mi><mi>m</mi><msub><mi>s</mi><mi>a</mi></msub><mo>+</mo><mo>=</mo><mn>1</mn><mspace linebreak="newline"></mspace><mi>n</mi><mi>u</mi><mi>m</mi><msub><mi>s</mi><mrow><mi>b</mi><mo>+</mo><mn>1</mn></mrow></msub><mo>−</mo><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">nums_a+=1  \\ nums_{b+1}-=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.73333em;vertical-align:-0.15em;"></span><span class="mord mathdefault">n</span><span class="mord mathdefault">u</span><span class="mord mathdefault">m</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">+</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.791661em;vertical-align:-0.208331em;"></span><span class="mord mathdefault">n</span><span class="mord mathdefault">u</span><span class="mord mathdefault">m</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361079999999999em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">b</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.208331em;"><span></span></span></span></span></span></span><span class="mord">−</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span></span></p><p>即对左侧端点进行这个修改，对右侧的右边一个进行逆修改。</p><p>然后是差分数组如何还原，进行前缀和运算就行了，因为前缀和是对数组前i项的累加，对左侧端点的修改就影响了后面的所有值，而对右侧端点的右边一个逆修改相当于消除了对之后的影响，于是就变成了对<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">[</mo><mi>a</mi><mo separator="true">,</mo><mi>b</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[a,b]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord mathdefault">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">b</span><span class="mclose">]</span></span></span></span>的操作，且这里所有的操作都是<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span></span></span></span>的。</p><p>然后使用这种算法再对上面的<code>先初始化一个长度为n，值为0的数组，然后对于上述的每个区间，将这个数组下标落在区间里的值加一，遍历完之后值最大的那个下标即为得分最高的k值</code>问题求解就很简单了。</p><h2 id="代码"><a class="markdownIt-Anchor" href="#代码"></a> 代码</h2><figure class="highlight rust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">impl</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">pub</span> <span class="keyword">fn</span> <span class="title function_">best_rotation</span>(nums: <span class="type">Vec</span>&lt;<span class="type">i32</span>&gt;) <span class="punctuation">-&gt;</span> <span class="type">i32</span> &#123;</span><br><span class="line">        <span class="keyword">let</span> <span class="variable">n</span> = nums.<span class="title function_ invoke__">len</span>();</span><br><span class="line">        <span class="keyword">let</span> <span class="keyword">mut </span><span class="variable">diff</span> = <span class="built_in">vec!</span>[<span class="number">0</span>; n+<span class="number">1</span>];</span><br><span class="line">        <span class="keyword">for</span> <span class="variable">i</span> <span class="keyword">in</span> <span class="number">0</span>..nums.<span class="title function_ invoke__">len</span>() &#123;</span><br><span class="line">            <span class="keyword">let</span> <span class="variable">left</span> = (i+<span class="number">1</span>)%n;</span><br><span class="line">            <span class="keyword">let</span> <span class="variable">right</span> = (i-(nums[i] <span class="keyword">as</span> <span class="type">usize</span>)+n)%n;</span><br><span class="line">            diff[left]+=<span class="number">1</span>;</span><br><span class="line">            diff[right+<span class="number">1</span>]-=<span class="number">1</span>;</span><br><span class="line">            <span class="keyword">if</span> left &gt; right &#123;</span><br><span class="line">                diff[<span class="number">0</span>]+=<span class="number">1</span>;</span><br><span class="line">                diff[n]-=<span class="number">1</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">let</span> <span class="keyword">mut </span><span class="variable">ans</span> = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">let</span> <span class="keyword">mut </span><span class="variable">tmp</span> = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">let</span> <span class="keyword">mut </span><span class="variable">sum</span> = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> <span class="variable">k</span> <span class="keyword">in</span> <span class="number">0</span>..n &#123;</span><br><span class="line">            sum += diff[k];</span><br><span class="line">            <span class="keyword">if</span> sum &gt; tmp &#123;</span><br><span class="line">                tmp = sum;</span><br><span class="line">                ans = k;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        ans <span class="keyword">as</span> <span class="type">i32</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;leetcode-798-得分最高的最小轮调-difficulty&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#leetcode-798-得分最高的最小轮调-difficulty&quot;&gt;&lt;/a&gt; Leetcode 798. &lt;a clas</summary>
      
    
    
    
    <category term="algorithm" scheme="https://nn.ci/categories/algorithm/"/>
    
    
    <category term="rust" scheme="https://nn.ci/tags/rust/"/>
    
  </entry>
  
  <entry>
    <title>Rust中的crate和mod</title>
    <link href="https://nn.ci/posts/rust-crate-mod.html"/>
    <id>https://nn.ci/posts/rust-crate-mod.html</id>
    <published>2022-02-17T06:08:00.000Z</published>
    <updated>2022-02-17T06:08:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="crate"><a class="markdownIt-Anchor" href="#crate"></a> crate</h1><p>先看看官方的定义：</p><blockquote><p>A crate is a binary or library. The <em>crate root</em> is a source file that the Rust compiler starts from and makes up the root module of your crate (we’ll explain modules in depth in the <a class="link"   href="https://doc.rust-lang.org/book/ch07-02-defining-modules-to-control-scope-and-privacy.html" >“Defining Modules to Control Scope and Privacy”<i class="fas fa-external-link-alt"></i></a> section). A <em>package</em> is one or more crates that provide a set of functionality. A package contains a <em>Cargo.toml</em> file that describes how to build those crates.</p></blockquote><p>crate是rust中的最小编译单元，也就是说rust是按照一个一个的crate来编译的，每个crate都有一个入口文件，可以是下面三种情况：</p><ul><li>src下的main.rs文件</li><li>src下的lib.rs文件（作为一个库）</li><li>src/bin目录下的任意文件（包含main函数）</li></ul><h1 id="mod"><a class="markdownIt-Anchor" href="#mod"></a> mod</h1><p>而mod则更像是C++中的命名空间，以下几种情况都可以作为一个根mod：</p><ul><li>一个单独的文件为一个mod</li><li><a class="link"   href="http://xn--mod-p18dohsa02ls3qvtcw1t736a.rs" >一个文件夹中包含mod.rs<i class="fas fa-external-link-alt"></i></a>（其他的文件在mod.rs中被声明成子mod）</li><li>文件夹同级的同名rs文件</li></ul><p>mod是可以嵌套的，它是一个树形结构，要想使用mod，则必须在某个入口文件中声明mod（其实rust就是以这个mod名称寻找文件进行了替换），而子mod则可以在它的父mod中进行声明，然后在要使用的地方有以下几种使用方式：</p><ul><li>在本文件中声明了mod，则可以直接使用这个mod；</li><li>使用use关键字引入在其他文件中声明的mod；</li><li>在src/bin目录下要使用同crate下的mod，则需要：在lib.rs中进行声明，然后使用这个crate的名称作为路径来use；</li><li>在src/main.rs 可以使用上一种方式，但也可以去掉lib.rs而直接在本文件中来声明mod；</li><li>所有的声明mod在其他文件中被use的话都需要pub导出；</li><li>use只是为了简化路径，也可以直接从根mod一直写下去而不使用use关键字。</li></ul><h1 id="示例"><a class="markdownIt-Anchor" href="#示例"></a> 示例</h1><p>文件：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">├─src</span><br><span class="line">│  │  lib.rs</span><br><span class="line">│  │  main.rs</span><br><span class="line">│  │</span><br><span class="line">│  ├─bin</span><br><span class="line">│  │      test.rs</span><br><span class="line">│  │</span><br><span class="line">│  └─test_mod</span><br><span class="line">│          child.rs</span><br><span class="line">│          mod.rs</span><br></pre></td></tr></table></figure><figure class="highlight rust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// test_mod/child.rs</span></span><br><span class="line"><span class="keyword">pub</span> <span class="keyword">fn</span> <span class="title function_">test</span>()&#123;</span><br><span class="line">    <span class="built_in">println!</span>(<span class="string">&quot;hello,world&quot;</span>)</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// test_mod/mod.rs</span></span><br><span class="line"><span class="keyword">pub</span> <span class="keyword">mod</span> child; <span class="comment">// 导出子mod</span></span><br><span class="line"><span class="comment">// lib.rs</span></span><br><span class="line"><span class="keyword">pub</span> <span class="keyword">mod</span> test_mod; <span class="comment">// 将本crate声明为一个库</span></span><br><span class="line"><span class="comment">// main.rs</span></span><br><span class="line"><span class="keyword">mod</span> test_mod;</span><br><span class="line"><span class="keyword">fn</span> <span class="title function_">main</span>() &#123;</span><br><span class="line">    test_mod::child::<span class="title function_ invoke__">test</span>();</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 或者直接：</span></span><br><span class="line"><span class="keyword">fn</span> <span class="title function_">main</span>() &#123;</span><br><span class="line">    crate_mod::test_mod::child::<span class="title function_ invoke__">test</span>()</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// bin/test.rs</span></span><br><span class="line"><span class="keyword">use</span> crate_mod::test_mod::child;</span><br><span class="line"><span class="keyword">fn</span> <span class="title function_">main</span>() &#123;</span><br><span class="line">    child::<span class="title function_ invoke__">test</span>()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;crate&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#crate&quot;&gt;&lt;/a&gt; crate&lt;/h1&gt;
&lt;p&gt;先看看官方的定义：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A crate is a binary or library. T</summary>
      
    
    
    
    <category term="learning" scheme="https://nn.ci/categories/learning/"/>
    
    
    <category term="rust" scheme="https://nn.ci/tags/rust/"/>
    
  </entry>
  
  <entry>
    <title>宝塔部署Alist教程</title>
    <link href="https://nn.ci/posts/bt-alist.html"/>
    <id>https://nn.ci/posts/bt-alist.html</id>
    <published>2022-01-17T06:08:00.000Z</published>
    <updated>2022-01-17T06:08:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>应广大宝塔用户的需求，“宝塔部署Alist教程”来了。</p><h2 id="安装alist"><a class="markdownIt-Anchor" href="#安装alist"></a> 安装Alist</h2><p>直接使用一键脚本就可以，先打开宝塔，然后点击左侧的<code>终端</code>，进入ssh终端，可能会让你输入密码，相信你应该知道自己的密码，然后复制下面的代码粘贴回车运行</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -fsSL <span class="string">&quot;https://nn.ci/alist.sh&quot;</span> | bash -s install</span><br></pre></td></tr></table></figure><p>当看到提示关于<code>YOUR_IP:5244</code>消息之后就成功了，注意这里也会输出初始的密码，记得记录下来。</p><h2 id="宝塔操作"><a class="markdownIt-Anchor" href="#宝塔操作"></a> 宝塔操作</h2><p>点击宝塔左侧的网站，新建一个网站相信你已经很熟悉这个操作了，类型选择静态/PHP就可以了。填入你的域名，新建网站完成。</p><p>建议先申请一个ssl证书开启https，因为此程序的部分功能需要https支持。</p><p>点击设置-配置文件。将默认文件的以下内容删除：</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#禁止访问的文件或目录</span></span><br><span class="line"><span class="section">location</span> <span class="regexp">~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="attribute">return</span> <span class="number">404</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="section">location</span> <span class="regexp">~ .*\.(gif|jpg|jpeg|png|bmp|swf)$</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="attribute">expires</span>      <span class="number">30d</span>;</span><br><span class="line">    <span class="attribute">error_log</span> /dev/null;</span><br><span class="line">    <span class="attribute">access_log</span> /dev/null;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="section">location</span> <span class="regexp">~ .*\.(js|css)?$</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="attribute">expires</span>      <span class="number">12h</span>;</span><br><span class="line">    <span class="attribute">error_log</span> /dev/null;</span><br><span class="line">    <span class="attribute">access_log</span> /dev/null; </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后在你删除的任意地方加入：</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">location</span> / &#123;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> Host <span class="variable">$http_host</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> X-Real-IP <span class="variable">$remote_addr</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> Range <span class="variable">$http_range</span>;</span><br><span class="line"><span class="attribute">proxy_set_header</span> If-Range <span class="variable">$http_if_range</span>;</span><br><span class="line">    <span class="attribute">proxy_redirect</span> <span class="literal">off</span>;</span><br><span class="line">    <span class="attribute">proxy_pass</span> http://127.0.0.1:5244;</span><br><span class="line">    <span class="comment"># 上传的最大文件尺寸</span></span><br><span class="line">    <span class="attribute">client_max_body_size</span> <span class="number">20000m</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>保存即可。</p><p>完成！打开你新建网站时填入的域名就可以打开了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;应广大宝塔用户的需求，“宝塔部署Alist教程”来了。&lt;/p&gt;
&lt;h2 id=&quot;安装alist&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#安装alist&quot;&gt;&lt;/a&gt; 安装Alist&lt;/h2&gt;
&lt;p&gt;直接使用一键脚本就可以，先打开宝塔，然后点击</summary>
      
    
    
    
    <category term="tutorials" scheme="https://nn.ci/categories/tutorials/"/>
    
    
    <category term="alist" scheme="https://nn.ci/tags/alist/"/>
    
    <category term="bt" scheme="https://nn.ci/tags/bt/"/>
    
  </entry>
  
  <entry>
    <title>目录列表程序AList使用教程</title>
    <link href="https://nn.ci/posts/alist.html"/>
    <id>https://nn.ci/posts/alist.html</id>
    <published>2021-11-03T06:08:00.000Z</published>
    <updated>2021-11-03T06:08:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="简介"><a class="markdownIt-Anchor" href="#简介"></a> 简介</h1><p>本文后续将在<a class="link"   href="https://alist-doc.nn.ci/" >https://alist-doc.nn.ci/<i class="fas fa-external-link-alt"></i></a>更新。提问请到<a class="link"   href="https://github.com/Xhofe/alist/discussions" >https://github.com/Xhofe/alist/discussions<i class="fas fa-external-link-alt"></i></a><br />AList是一款支持多种存储的目录文件列表程序，后端基于gin，前端使用react。</p><blockquote><p><a class="link"   href="https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md" >https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md<i class="fas fa-external-link-alt"></i></a></p></blockquote><h1 id="项目地址"><a class="markdownIt-Anchor" href="#项目地址"></a> 项目地址</h1><ul><li><a class="link"   href="https://github.com/Xhofe/alist" >https://github.com/Xhofe/alist<i class="fas fa-external-link-alt"></i></a></li><li><a class="link"   href="https://github.com/Xhofe/alist-web" >https://github.com/Xhofe/alist-web<i class="fas fa-external-link-alt"></i></a></li></ul><h1 id="预览"><a class="markdownIt-Anchor" href="#预览"></a> 预览</h1><ul><li><a class="link"   href="https://alist.nn.ci" >https://alist.nn.ci<i class="fas fa-external-link-alt"></i></a> (稳定版本,即Github Release的最新版本)</li><li><a class="link"   href="https://alist.now.sh" >https://alist.now.sh<i class="fas fa-external-link-alt"></i></a> (开发版本,随着GitHub提交更新)<br /><img                       lazyload                     src="/images/loading.svg"                     data-src="alist/695ef77854a144e928518efde38db97a.png"                      alt="alist预览图片"                 ></li></ul><h1 id="部署"><a class="markdownIt-Anchor" href="#部署"></a> 部署</h1><p>先打开 <a class="link"   href="https://github.com/Xhofe/alist" >https://github.com/Xhofe/alist<i class="fas fa-external-link-alt"></i></a> 点个star😁</p><h2 id="手动部署"><a class="markdownIt-Anchor" href="#手动部署"></a> 手动部署</h2><h3 id="运行起来"><a class="markdownIt-Anchor" href="#运行起来"></a> 运行起来</h3><ol><li>打开<a class="link"   href="https://github.com/Xhofe/alist/releases" >AList Release<i class="fas fa-external-link-alt"></i></a>下载要部署的系统对应的文件</li><li>解压下载对文件得到可执行文件：<code>tar -zxvf alist-xxxx.tar.gz</code>（Linux）</li><li>赋予程序执行权限：<code>chmod +x alist-xxxx</code></li><li>运行程序：<code>./alist-xxxx</code></li><li>完成，后台默认密码为<code>alist</code></li></ol><h3 id="守护进程"><a class="markdownIt-Anchor" href="#守护进程"></a> 守护进程</h3><p><code>vim /usr/lib/systemd/system/alist.service</code>添加以下内容，其中path_alist为alist所在的路径</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[Unit]</span></span><br><span class="line"><span class="attr">Description</span>=alist</span><br><span class="line"><span class="attr">After</span>=network.target</span><br><span class="line"></span><br><span class="line"><span class="section">[Service]</span></span><br><span class="line"><span class="attr">Type</span>=simple</span><br><span class="line"><span class="attr">WorkingDirectory</span>=path_alist</span><br><span class="line"><span class="attr">ExecStart</span>=path_alist/alist-xxxx -conf data/config.json</span><br><span class="line"><span class="attr">Restart</span>=<span class="literal">on</span>-failure</span><br><span class="line"></span><br><span class="line"><span class="section">[Install]</span></span><br><span class="line"><span class="attr">WantedBy</span>=multi-user.target</span><br></pre></td></tr></table></figure><p>然后<code>systemctl daemon-reload</code>重载配置，现在你就可以使用这些命令来管理程序了：</p><ul><li>启动: <code>systemctl start alist</code></li><li>关闭: <code>systemctl stop alist</code></li><li>自启: <code>systemctl enable alist</code></li><li>状态: <code>systemctl status alist</code></li><li>重启: <code>systemctl restart alist</code></li></ul><h2 id="使用docker"><a class="markdownIt-Anchor" href="#使用docker"></a> 使用Docker</h2><ul><li>开发版：<code>docker run -d --restart=always -v /etc/alist:/opt/alist/data -p 5244:5244 --name=&quot;alist&quot; xhofe/alist:v2</code></li><li>稳定版：<code>docker run -d --restart=always -v /etc/alist:/opt/alist/data -p 5244:5244 --name=&quot;alist&quot; xhofe/alist:latest</code></li><li>指定版本：具体见https://hub.docker.com/r/xhofe/alist</li></ul><h2 id="从源码运行"><a class="markdownIt-Anchor" href="#从源码运行"></a> 从源码运行</h2><p>首先需要有nodejs、yarn、golang&gt;1.17的环境</p><h3 id="构建前端"><a class="markdownIt-Anchor" href="#构建前端"></a> 构建前端</h3><p>clone <a class="link"   href="https://github.com/Xhofe/alist-web" >https://github.com/Xhofe/alist-web<i class="fas fa-external-link-alt"></i></a> 这个项目，执行yarn&amp;&amp; yarn build，得到dist目录下的目标文件</p><h3 id="构建后端"><a class="markdownIt-Anchor" href="#构建后端"></a> 构建后端</h3><p>将上一步dist目录下的文件全部拷贝至 <a class="link"   href="https://github.com/Xhofe/alist" >https://github.com/Xhofe/alist<i class="fas fa-external-link-alt"></i></a> 项目下的public目录，然后：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">appName=<span class="string">&quot;alist&quot;</span></span><br><span class="line">builtAt=<span class="string">&quot;<span class="subst">$(date +&#x27;%F %T %z&#x27;)</span>&quot;</span></span><br><span class="line">goVersion=$(go version | sed <span class="string">&#x27;s/go version //&#x27;</span>)</span><br><span class="line">gitAuthor=$(git show -s --format=<span class="string">&#x27;format:%aN &lt;%ae&gt;&#x27;</span> HEAD)</span><br><span class="line">gitCommit=$(git <span class="built_in">log</span> --pretty=format:<span class="string">&quot;%h&quot;</span> -1)</span><br><span class="line">gitTag=$(git describe --long --tags --dirty --always)</span><br><span class="line">ldflags=<span class="string">&quot;\</span></span><br><span class="line"><span class="string">-w -s \</span></span><br><span class="line"><span class="string">-X &#x27;github.com/Xhofe/alist/conf.BuiltAt=<span class="variable">$builtAt</span>&#x27; \</span></span><br><span class="line"><span class="string">-X &#x27;github.com/Xhofe/alist/conf.GoVersion=<span class="variable">$goVersion</span>&#x27; \</span></span><br><span class="line"><span class="string">-X &#x27;github.com/Xhofe/alist/conf.GitAuthor=<span class="variable">$gitAuthor</span>&#x27; \</span></span><br><span class="line"><span class="string">-X &#x27;github.com/Xhofe/alist/conf.GitCommit=<span class="variable">$gitCommit</span>&#x27; \</span></span><br><span class="line"><span class="string">-X &#x27;github.com/Xhofe/alist/conf.GitTag=<span class="variable">$gitTag</span>&#x27; \</span></span><br><span class="line"><span class="string">&quot;</span></span><br><span class="line">go build -ldflags=<span class="string">&quot;<span class="variable">$ldflags</span>&quot;</span> alist.go</span><br></pre></td></tr></table></figure><h2 id="反向代理"><a class="markdownIt-Anchor" href="#反向代理"></a> 反向代理</h2><p>程序默认监听5244端口，要实现https访问，需要使用nginx反向代理，在配置文件中加入</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">location</span> / &#123;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> Host <span class="variable">$http_host</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> X-Real-IP <span class="variable">$remote_addr</span>;</span><br><span class="line">    <span class="attribute">proxy_redirect</span> <span class="literal">off</span>;</span><br><span class="line">    <span class="attribute">proxy_pass</span> http://127.0.0.1:5244;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="使用"><a class="markdownIt-Anchor" href="#使用"></a> 使用</h1><p>后台默认密码为<code>alist</code></p><h2 id="添加账号"><a class="markdownIt-Anchor" href="#添加账号"></a> 添加账号</h2><p>所有账号的必填项：</p><ul><li>name（名称）：唯一标识符，也是当有多个账号时展示的路径</li><li>index（索引）：当有多个账号时，用于排序，越小越靠前</li><li>proxy（带理）：是否允许服务器中转下载</li></ul><h3 id="本地存储"><a class="markdownIt-Anchor" href="#本地存储"></a> 本地存储</h3><p>只需填写根目录路径即可，可以是绝对路径，也可以是程序所在的相对路径</p><h3 id="阿里云盘"><a class="markdownIt-Anchor" href="#阿里云盘"></a> 阿里云盘</h3><ul><li>refresh_token（刷新令盘）：如何获取参考这个<a class="link"   href="https://github.com/Xhofe/alist/issues/88" >issue<i class="fas fa-external-link-alt"></i></a>通过手机端抓包/查找日志（<code>/data/media/0/Android/data/com.alicloud.databox/files/logs/trace/</code>）来获取,或使用https://media.cooluc.com/decode_token/</li><li>根目录file_id：打开阿里云盘官网，点进去你要设置的文件夹时url后面的一串，如<code>https://www.aliyundrive.com/drive/folder/5fe01e1830601baf774e4827a9fb8fb2b5bf7940</code>就是<code>5fe01e1830601baf774e4827a9fb8fb2b5bf7940</code></li><li>order_by（排序）：可选值为<code>name</code>，<code>size</code>，<code>updated_at</code>，<code>created_at</code></li><li>order_direction（排序方向）：可选<code>ASC</code>（正序），<code>DESC</code>（倒序）</li></ul><h3 id="onedrive"><a class="markdownIt-Anchor" href="#onedrive"></a> Onedrive</h3><p>打开https://tool.nn.ci/onedrive/request</p><h4 id="创建应用"><a class="markdownIt-Anchor" href="#创建应用"></a> 创建应用</h4><ul><li>在打开的页面，选择所在区域，点击创建应用</li><li>登陆后选择「注册应用程序」，输入「名称」，选择「任何组织目录中的账户和个人」（注意这里不要看位置选择而是看文字，部分人可能是中间那个选项，不要选成单一租户或者其他选项，否则会导致登陆时出现问题），输入重定向 URL 为 <a class="link"   href="https://tool.nn.ci/onedrive/callback%EF%BC%8C%E3%80%8C%E6%B3%A8%E5%86%8C%E3%80%8D%E5%8D%B3%E5%8F%AF%EF%BC%8C%E7%84%B6%E5%90%8E%E5%8F%AF%E4%BB%A5%E5%BE%97%E5%88%B0" >https://tool.nn.ci/onedrive/callback，「注册」即可，然后可以得到<i class="fas fa-external-link-alt"></i></a><code>client_id</code></li><li>注册好应用程序之后，选择「证书和密码」，点击「新客户端密码」，输入一串密码，选择时间为最长的那个，点击「添加」<br />（注：在添加之后输入的密码之后会消失，请记录下来 <code>client_secret</code> 的值）</li></ul><h4 id="获取刷新令牌"><a class="markdownIt-Anchor" href="#获取刷新令牌"></a> 获取刷新令牌</h4><p>将上一步骤中获得的<code>client_id</code>和<code>client_secret</code>填入https://tool.nn.ci/onedrive/request 这个页面，点击获取刷新令牌，就可以得到刷新令牌了</p><h4 id="获取sharepoint-site_id未测试"><a class="markdownIt-Anchor" href="#获取sharepoint-site_id未测试"></a> 获取Sharepoint site_id（未测试）</h4><p>如果需要挂载Sharepoint，完成上一步后，在显示刷新令牌的界面会出现一个输入站点地址，输入站点地址后点击获取site_id即可。</p><h4 id="添加账号-2"><a class="markdownIt-Anchor" href="#添加账号-2"></a> 添加账号</h4><p>将上述过程中获取得到的值依次填入即可。</p><h3 id="天翼云盘"><a class="markdownIt-Anchor" href="#天翼云盘"></a> 天翼云盘</h3><p>填写账号（手机号），密码即可。可能会触发验证码，可等一段时间再重试。<br />根目录ID：与阿里云盘类似，官网url最后面一串，如：</p><ul><li><code>https://cloud.189.cn/web/main/file/folder/-11</code> -&gt; <code>-11</code></li><li><code>https://cloud.189.cn/web/main/file/folder/71398114617385472</code> -&gt; <code>71398114617385472</code></li></ul><h3 id="googledrive支持团队盘"><a class="markdownIt-Anchor" href="#googledrive支持团队盘"></a> GoogleDrive（支持团队盘）</h3><p>参照https://install.kenci.workers.dev/ 获取<code>client_id</code>,<code>client_secret</code>,<code>refresh_token</code>；或：</p><ol><li>Open <a class="link"   href="https://console.developers.google.com/apis/api/drive.googleapis.com/overview" >Google Drive API<i class="fas fa-external-link-alt"></i></a></li><li>Create a <a class="link"   href="https://console.developers.google.com/apis/credentials/oauthclient" >OAuth client ID<i class="fas fa-external-link-alt"></i></a></li><li>Install rclone software locally</li><li>Get refresh_token with rclone</li></ol><h3 id="123pan"><a class="markdownIt-Anchor" href="#123pan"></a> 123Pan</h3><p>填写账号密码即可。</p><h2 id="元信息meta设置"><a class="markdownIt-Anchor" href="#元信息meta设置"></a> 元信息（meta）设置</h2><p>此处的path（路径）是访问alist页面时的pathname，如要设置<code>https://alist.nn.ci/本地存储</code>则路径是<code>/本地存储</code></p><h3 id="设置密码"><a class="markdownIt-Anchor" href="#设置密码"></a> 设置密码</h3><p>填写密码字段即可</p><h3 id="隐藏文件文件夹"><a class="markdownIt-Anchor" href="#隐藏文件文件夹"></a> 隐藏文件/文件夹</h3><p>填写hide字段，填写要隐藏的文件（夹）名称，以<code>,</code>分隔，比如要隐藏<code>https://alist.nn.ci/本地存储</code>下的<code>README.md</code>和<code>index.tsx</code>文件，则填写<code>README.md,index.tsx</code>即可。</p><h2 id="常见问题"><a class="markdownIt-Anchor" href="#常见问题"></a> 常见问题</h2><ul><li>向前不兼容版本记录<br />v2.0.0-beta5</li><li>阿里云盘视频无法播放，下载显示InvalidArgument？<br />由于referrer的限制，必须使用移动端token</li><li>视频播放不了？<br />然后检查一下是不是编码不支持，一般浏览器不支持h.265（hevc）等编码视频，ac3等编码音频，Safari不支持的更多，建议使用软件播放。</li><li>获取中转链接？<br />允许中转之后，复制对应文件直链，将/d改成/p即可。</li><li>前端文件在哪里？<br />为方便安装，前端文件与程序打包在一起了，如需修改，请按照<code>从源码运行</code>自行修改编译或填写自定义样式/脚本字段。</li><li>密码忘了怎么半？<br />命令行 <code>./alist-xxxx -password</code>查看。</li><li>自定义样式/脚本不生效？<br />是否前后端分开了？自定义部分为后端处理，只有在不分开时才起作用。</li><li>上传的文件不显示/删除的文件还在？<br />程序缓存一小时自动失效，后台右上角可手动清除缓存。</li></ul><h1 id="请我喝杯奶茶"><a class="markdownIt-Anchor" href="#请我喝杯奶茶"></a> 请我喝杯奶茶</h1><p><img                       lazyload                     src="/images/loading.svg"                     data-src="alist/9319ae9d532c7929d2c5f536619c29f7.png"                      alt=""                 ></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;简介&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#简介&quot;&gt;&lt;/a&gt; 简介&lt;/h1&gt;
&lt;p&gt;本文后续将在&lt;a class=&quot;link&quot;   href=&quot;https://alist-doc.nn.ci/&quot; &gt;https://alist-d</summary>
      
    
    
    
    <category term="tutorials" scheme="https://nn.ci/categories/tutorials/"/>
    
    
    <category term="go" scheme="https://nn.ci/tags/go/"/>
    
    <category term="gin" scheme="https://nn.ci/tags/gin/"/>
    
    <category term="alist" scheme="https://nn.ci/tags/alist/"/>
    
    <category term="github" scheme="https://nn.ci/tags/github/"/>
    
    <category term="react" scheme="https://nn.ci/tags/react/"/>
    
  </entry>
  
  <entry>
    <title>C++中size_t循环的坑</title>
    <link href="https://nn.ci/posts/cpp-size_t-compare.html"/>
    <id>https://nn.ci/posts/cpp-size_t-compare.html</id>
    <published>2021-04-13T06:08:00.000Z</published>
    <updated>2021-04-13T06:08:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>代码：</p><span id="more"></span><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&quot;utils.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">calMinDis</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="type">bool</span> **_map = <span class="literal">NULL</span>;</span><br><span class="line">    <span class="type">int</span> **_min_dis;</span><br><span class="line">    <span class="type">int</span> _height = <span class="number">100</span>;</span><br><span class="line">    <span class="type">int</span> _width = <span class="number">200</span>;</span><br><span class="line"></span><br><span class="line">    _map = <span class="keyword">new</span> <span class="type">bool</span>*[_height];</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">size_t</span> i = <span class="number">0</span>; i &lt; _height; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        _map[i] = <span class="keyword">new</span> <span class="type">bool</span>[_width];</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;cal min dis.\n&quot;</span>);</span><br><span class="line">    <span class="keyword">if</span> (_map == <span class="literal">NULL</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;map haven&#x27;t init.\n&quot;</span>);</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    _min_dis = <span class="keyword">new</span> <span class="type">int</span> *[_height];</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">size_t</span> i = <span class="number">0</span>; i &lt; _height; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        _min_dis[i] = <span class="keyword">new</span> <span class="type">int</span>[_width];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="type">int</span> MAX_INT = <span class="number">0xffffffff</span> &gt;&gt; <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">size_t</span> i = <span class="number">0</span>; i &lt; _height; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">size_t</span> j = <span class="number">0</span>; j &lt; _width; j++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (_map[i][j])</span><br><span class="line">            &#123;</span><br><span class="line">                _min_dis[i][j] = MAX_INT;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span></span><br><span class="line">            &#123;</span><br><span class="line">                _min_dis[i][j] = <span class="number">0</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">size_t</span> i = <span class="number">0</span>; i &lt; _height; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">size_t</span> j = <span class="number">0</span>; j &lt; _width; j++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (!_map[i][j])</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">continue</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (i &gt; <span class="number">0</span> &amp;&amp; _min_dis[i - <span class="number">1</span>][j] &lt; _min_dis[i][j])</span><br><span class="line">            &#123;</span><br><span class="line">                _min_dis[i][j] = _min_dis[i - <span class="number">1</span>][j] + <span class="number">1</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (j &gt; <span class="number">0</span> &amp;&amp; _min_dis[i][j - <span class="number">1</span>] &lt; _min_dis[i][j])</span><br><span class="line">            &#123;</span><br><span class="line">                _min_dis[i][j] = _min_dis[i][j - <span class="number">1</span>] + <span class="number">1</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;1\n&quot;</span>);</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">size_t</span> i = _height - <span class="number">1</span>; i &gt;= <span class="number">0</span>; i--)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">size_t</span> j = _width - <span class="number">1</span>; j &gt;= <span class="number">0</span>; j--)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">&quot;(%d,%d)\n&quot;</span>,i,j);</span><br><span class="line">            <span class="keyword">if</span> (!_map[i][j])</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">continue</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (i + <span class="number">1</span> &lt; _height &amp;&amp; _min_dis[i + <span class="number">1</span>][j] &lt; _min_dis[i][j])</span><br><span class="line">            &#123;</span><br><span class="line">                _min_dis[i][j] = _min_dis[i + <span class="number">1</span>][j] + <span class="number">1</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (j + <span class="number">1</span> &lt; _width &amp;&amp; _min_dis[i][j + <span class="number">1</span>] &lt; _min_dis[i][j])</span><br><span class="line">            &#123;</span><br><span class="line">                _min_dis[i][j] = _min_dis[i][j + <span class="number">1</span>] + <span class="number">1</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;finished cal min dis.\n&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">char</span> <span class="type">const</span> *argv[])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="built_in">calMinDis</span>();</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这段代码看起来没什么问题，实则隐藏了很大的坑，因为<code>for (size_t i = _height - 1; i &gt;= 0; i--)</code>这个循环中使用了<code>size_t</code>，加上输出之后会发现，循环停不下来，直至出现<code>segmentation fault</code>;<br />这是因为<code>size_t</code>是一种非负类型，它永远都不可能会小于0,所以循环停不下来。把<code>size_t</code>改成<code>int</code>就没问题了。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;代码：&lt;/p&gt;</summary>
    
    
    
    <category term="issues" scheme="https://nn.ci/categories/issues/"/>
    
    
    <category term="C++" scheme="https://nn.ci/tags/C/"/>
    
  </entry>
  
  <entry>
    <title>阿里云盘列表AList部署教程(V1)</title>
    <link href="https://nn.ci/posts/alist-v1.html"/>
    <id>https://nn.ci/posts/alist-v1.html</id>
    <published>2021-03-13T06:08:00.000Z</published>
    <updated>2021-03-13T06:08:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="简介"><a class="markdownIt-Anchor" href="#简介"></a> 简介</h1><blockquote><p><strong>此版本不再维护，请使用新版：<a class="link"   href="https://github.com/Xhofe/alist" >https://github.com/Xhofe/alist<i class="fas fa-external-link-alt"></i></a></strong><br />AList是一款阿里云盘的目录文件列表程序，后端基于<code>golang</code>最好的<code>http</code>框架<code>gin</code>，前端使用<code>vue</code>和<code>ant design</code>。没有专门学过前端，大佬轻喷?</p></blockquote><blockquote><p>更新计划：<a class="link"   href="https://www.notion.so/AList-993f3a1a43fc464588f018b46369672e%EF%BC%8C%E6%9C%89%E5%A5%BD%E7%9A%84%E5%BB%BA%E8%AE%AE%E5%8F%AF%E4%BB%A5%E8%AF%84%E8%AE%BA%E6%88%96%E5%9C%A8issue%E4%B8%AD%E5%91%8A%E8%AF%89%E6%88%91%E3%80%82" >https://www.notion.so/AList-993f3a1a43fc464588f018b46369672e，有好的建议可以评论或在issue中告诉我。<i class="fas fa-external-link-alt"></i></a></p></blockquote><p>本程序仅供学习研究使用！！！发现任何bug请提issue，部署上遇到问题欢迎加群交流。<br />更新的时候后端和前端文件都需要替换！！！！以及补上配置文件新的配置项！！！！第一次启动需要网页底部rebuild！！！<br />更新的时候后端和前端文件都需要替换！！！！以及补上配置文件新的配置项！！！！第一次启动需要网页底部rebuild！！！<br />更新的时候后端和前端文件都需要替换！！！！以及补上配置文件新的配置项！！！！第一次启动需要网页底部rebuild！！！</p><h1 id="项目地址"><a class="markdownIt-Anchor" href="#项目地址"></a> 项目地址：</h1><ul><li><a class="link"   href="https://github.com/Xhofe/alist" >https://github.com/Xhofe/alist<i class="fas fa-external-link-alt"></i></a></li><li><a class="link"   href="https://github.com/Xhofe/alist-web" >https://github.com/Xhofe/alist-web<i class="fas fa-external-link-alt"></i></a></li></ul><h1 id="快捷部署by-大白一号"><a class="markdownIt-Anchor" href="#快捷部署by-大白一号"></a> 快捷部署（by <a class="link"   href="https://www.cooluc.com/" >大白一号<i class="fas fa-external-link-alt"></i></a>）</h1><ul><li>脚本安装：<code>bash -c &quot;$(curl -sS https://www.cooluc.com/alist-install.sh)&quot;</code></li><li>refresh_token获取：<a class="link"   href="https://media.cooluc.com/decode_token/" >https://media.cooluc.com/decode_token/<i class="fas fa-external-link-alt"></i></a></li><li>Heroku部署： <a class="link"   href="https://github.com/sbwml/alist-heroku" >https://github.com/sbwml/alist-heroku<i class="fas fa-external-link-alt"></i></a></li></ul><h1 id="更新"><a class="markdownIt-Anchor" href="#更新"></a> 更新</h1><h2 id="202151"><a class="markdownIt-Anchor" href="#202151"></a> 2021.5.1</h2><ul><li>在线预览视频时间延长到4小时 (<a class="link"   href="https://github.com/Xhofe/alist/pull/96" >#96<i class="fas fa-external-link-alt"></i></a>)</li><li>指定路径与深度rebuild</li><li>优化请求：分次请求</li><li>增加右键菜单</li><li>支持多选、导出直链/秒传（需要rebuild，借助https://bbs.tampermonkey.net.cn/thread-427-1-1.html）</li><li>直链编码</li></ul><h2 id="2021331"><a class="markdownIt-Anchor" href="#2021331"></a> 2021.3.31</h2><ul><li>优化路径栏</li><li>修复了因为Referer导致不能下载的问题（<a class="link"   href="https://github.com/122cygf" >122cygf<i class="fas fa-external-link-alt"></i></a>）</li><li>增加了视频转码选项</li><li>图片缩略图预览</li><li>修复了json文件无法预览的bug</li></ul><h2 id="2021317"><a class="markdownIt-Anchor" href="#2021317"></a> 2021.3.17</h2><p>本次更新需要修改配置文件，更新之后/首次运行都需要手动rebuild一下。</p><ul><li>支持多盘</li><li>直链url密码哈希</li><li>修复不需要密码的文件复制直链也会携带密码的bug</li><li>数据库支持mysql</li><li>修复从文件返回目录Readme不更新的bug</li><li>重建目录时遮罩，优化体验</li><li>支持flv视频（部分浏览器可能不支持，详见https://github.com/Bilibili/flv.js/）</li></ul><h2 id="2021313"><a class="markdownIt-Anchor" href="#2021313"></a> 2021.3.13</h2><ul><li><p>后端引入sqlite3，列表部分不再依赖api，提高响应速度</p></li><li><p>支持搜索功能</p></li><li><p>前端使用vue3+ts重构</p></li><li><p>url支持按照目录结果展示</p></li><li><p>音乐播放支持列表</p></li><li><p>支持隐藏文件夹</p></li><li><p>更好的密码支持</p></li><li><p>更早的更新：<a class="link"   href="https://www.nn.ci/archives/alist-v0.html" >https://www.nn.ci/archives/alist-v0.html<i class="fas fa-external-link-alt"></i></a></p></li></ul><h1 id="预览"><a class="markdownIt-Anchor" href="#预览"></a> 预览</h1><ul><li><a class="link"   href="https://alist.nn.ci" >https://alist.nn.ci<i class="fas fa-external-link-alt"></i></a> (稳定版本,即Github Release的最新版本)</li><li><a class="link"   href="https://alist.now.sh" >https://alist.now.sh<i class="fas fa-external-link-alt"></i></a> (开发版本,随着GitHub提交更新)</li></ul><p><img                       lazyload                     src="/images/loading.svg"                     data-src="alist-v1/d81d2dab3e5f0.png"                      alt="alist预览"                 ></p><h1 id="如何部署"><a class="markdownIt-Anchor" href="#如何部署"></a> 如何部署</h1><p>首先第一步，Star本项目<a class="link"   href="https://github.com/Xhofe/alist" >AList<i class="fas fa-external-link-alt"></i></a>(bushi</p><h2 id="获取refresh_token"><a class="markdownIt-Anchor" href="#获取refresh_token"></a> 获取<code>refresh_token</code></h2><p>web端token加入了referrer限制，请参考这个<a class="link"   href="https://github.com/Xhofe/alist/issues/88" >issue<i class="fas fa-external-link-alt"></i></a>通过手机端抓包/查找日志（<code>/data/media/0/Android/data/com.alicloud.databox/files/logs/trace/</code>）来获取refresh_token，或使用https://media.cooluc.com/decode_token/。<br /><s>为什么不直接使用<code>access_token</code>，因为有效期只有两小时。经<a class="link"   href="https://www.hostloc.com/space-uid-22146.html" >Syc<i class="fas fa-external-link-alt"></i></a>大佬的提醒，获取<code>refresh_token</code>其实没这么麻烦，我们只需要登陆阿里云盘之后，打开开发者工具，切换到<code>Application</code>选项卡，点开<code>Local storage</code>,会有一个<code>token</code>项，点开就可以看到<code>refresh_token</code>了，此处感谢一下<a class="link"   href="https://www.hostloc.com/space-uid-22146.html" >Syc<i class="fas fa-external-link-alt"></i></a>大佬。</s></p><h2 id="部署"><a class="markdownIt-Anchor" href="#部署"></a> 部署</h2><h3 id="使用gin作为静态资源服务器"><a class="markdownIt-Anchor" href="#使用gin作为静态资源服务器"></a> 使用gin作为静态资源服务器</h3><ul><li>前往<a class="link"   href="https://github.com/Xhofe/alist/releases" >AList Release<i class="fas fa-external-link-alt"></i></a>下载对应系统的程序，解压得到一个示例配置文件和一个系统名称文件夹里面包含运行文件<code>alist</code></li><li>前往<a class="link"   href="https://github.com/Xhofe/alist-web/releases" >AList-web<i class="fas fa-external-link-alt"></i></a>下载打包好的前端，解压得到一个dist目录放到<code>alist</code>同级目录下</li><li>在同级目录下新建一个配置文件<code>conf.yml</code>，复制以下内容到该文件中，或直接使用示例配置文件进行修改</li></ul><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">info:</span></span><br><span class="line">  <span class="attr">title:</span> <span class="string">AList</span> <span class="comment">#标题</span></span><br><span class="line">  <span class="attr">logo:</span> <span class="string">&quot;&quot;</span> <span class="comment">#网站logo 如果填写,则会替换掉默认的</span></span><br><span class="line">  <span class="attr">footer_text:</span> <span class="string">Xhofe&#x27;s</span> <span class="string">Blog</span> <span class="comment">#网页底部文字</span></span><br><span class="line">  <span class="attr">footer_url:</span> <span class="string">https://www.nn.ci</span> <span class="comment">#网页底部文字链接</span></span><br><span class="line">  <span class="attr">music_img:</span> <span class="string">https://img.xhofe.top/2020/12/19/0f8b57866bdb5.gif</span> <span class="comment">#预览音乐文件时的图片</span></span><br><span class="line">  <span class="attr">check_update:</span> <span class="literal">true</span> <span class="comment">#前端是否显示更新</span></span><br><span class="line">  <span class="attr">script:</span> <span class="comment">#自定义脚本,可以是脚本的链接，也可以直接是脚本内容</span></span><br><span class="line">  <span class="attr">autoplay:</span> <span class="literal">true</span> <span class="comment">#视频是否自动播放</span></span><br><span class="line">  <span class="attr">preview:</span></span><br><span class="line">    <span class="attr">text:</span> [<span class="string">txt</span>,<span class="string">htm</span>,<span class="string">html</span>,<span class="string">xml</span>,<span class="string">java</span>,<span class="string">properties</span>,<span class="string">sql</span>,<span class="string">js</span>,<span class="string">md</span>,<span class="string">json</span>,<span class="string">conf</span>,<span class="string">ini</span>,<span class="string">vue</span>,<span class="string">php</span>,<span class="string">py</span>,<span class="string">bat</span>,<span class="string">gitignore</span>,<span class="string">yml</span>,<span class="string">go</span>,<span class="string">sh</span>,<span class="string">c</span>,<span class="string">cpp</span>,<span class="string">h</span>,<span class="string">hpp</span>] <span class="comment">#要预览的文本文件的后缀，可以自行添加</span></span><br><span class="line"><span class="attr">server:</span></span><br><span class="line">  <span class="attr">address:</span> <span class="string">&quot;0.0.0.0&quot;</span></span><br><span class="line">  <span class="attr">port:</span> <span class="string">&quot;5244&quot;</span></span><br><span class="line">  <span class="attr">search:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">download:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">static:</span> <span class="string">dist</span></span><br><span class="line">  <span class="attr">site_url:</span> <span class="string">&#x27;*&#x27;</span></span><br><span class="line">  <span class="attr">password:</span> <span class="string">password</span> <span class="comment">#用于重建目录</span></span><br><span class="line"><span class="attr">ali_drive:</span></span><br><span class="line">  <span class="attr">api_url:</span> <span class="string">https://api.aliyundrive.com/v2</span></span><br><span class="line">  <span class="attr">max_files_count:</span> <span class="number">3000</span></span><br><span class="line">  <span class="attr">drives:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">refresh_token:</span> <span class="string">xxx</span> <span class="comment">#refresh_token</span></span><br><span class="line">    <span class="attr">root_folder:</span> <span class="string">root</span> <span class="comment">#根目录的file_id</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">drive0</span> <span class="comment">#盘名，多个盘不可重复，这里只是示例，不是一定要叫这个名字，可随意修改</span></span><br><span class="line">    <span class="attr">password:</span> <span class="string">pass</span> <span class="comment">#该盘密码，空（&#x27;&#x27;）则不设密码，修改需要重建生效</span></span><br><span class="line">    <span class="attr">hide:</span> <span class="literal">false</span> <span class="comment">#是否在主页隐藏该盘，不可全部隐藏，至少暴露一个</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">refresh_token:</span> <span class="string">xxx</span> <span class="comment">#只有一个盘的话，该段完全可以删除，反之有更多可以继续添加</span></span><br><span class="line">    <span class="attr">root_folder:</span> <span class="string">root</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">drive1</span></span><br><span class="line">    <span class="attr">password:</span> <span class="string">pass</span></span><br><span class="line">    <span class="attr">hide:</span> <span class="literal">false</span></span><br><span class="line"><span class="attr">database:</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">sqlite3</span></span><br><span class="line">  <span class="attr">dBFile:</span> <span class="string">alist.db</span></span><br></pre></td></tr></table></figure><ul><li>填入最开始获取到的<code>refresh_token</code>，然后自行修改配置文件中默认的值</li><li>现在的情况应该是，目录下有两个文件<code>alist</code>、<code>conf.yml</code>和一个文件夹<code>dist</code>:</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">$ tree</span><br><span class="line">.</span><br><span class="line">├── alist</span><br><span class="line">├── conf.yml</span><br><span class="line">└── dist</span><br><span class="line">    ├── favicon.ico</span><br><span class="line">    ├── index.html</span><br><span class="line">    └── static</span><br><span class="line">        ├── css</span><br><span class="line">        │   ├── about.f0b54b1c.css</span><br><span class="line">        │   ├── app.4f0c3e9a.css</span><br><span class="line">        │   └── chunk-vendors.8f913079.css</span><br><span class="line">        ├── img</span><br><span class="line">        │   └── alist.bcb68ba0.png</span><br><span class="line">        └── js</span><br><span class="line">            ├── about.8108f65b.js</span><br><span class="line">            ├── app.34cb39e5.js</span><br><span class="line">            └── chunk-vendors.131f0f41.js</span><br><span class="line"></span><br><span class="line">5 directories, 12 files</span><br></pre></td></tr></table></figure><p>在该文件夹下面执行下面的命令（Linux）</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">chmod</span> +x alist</span><br><span class="line"><span class="built_in">nohup</span> ./alist &gt; log.log 2&gt;&amp;1 &amp;</span><br></pre></td></tr></table></figure><p>ok，程序已经跑起来了。你可以<code>cat log.log</code>看看有没有报错。或者访问http://ip:5244进行查看。</p><h4 id="守护进程可选"><a class="markdownIt-Anchor" href="#守护进程可选"></a> 守护进程（可选）</h4><p><code>vim /usr/lib/systemd/system/alist.service</code>添加以下内容，其中path_alist为alist所在的路径</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[Unit]</span></span><br><span class="line"><span class="attr">Description</span>=alist</span><br><span class="line"><span class="attr">After</span>=network.target</span><br><span class="line"></span><br><span class="line"><span class="section">[Service]</span></span><br><span class="line"><span class="attr">Type</span>=simple</span><br><span class="line"><span class="attr">WorkingDirectory</span>=path_alist</span><br><span class="line"><span class="attr">ExecStart</span>=path_alist/alist -conf conf.yml</span><br><span class="line"><span class="attr">Restart</span>=<span class="literal">on</span>-failure</span><br><span class="line"></span><br><span class="line"><span class="section">[Install]</span></span><br><span class="line"><span class="attr">WantedBy</span>=multi-user.target</span><br></pre></td></tr></table></figure><p>然后<code>systemctl daemon-reload</code>重载配置，现在你就可以使用这些命令来管理程序了：</p><ul><li>启动: <code>systemctl start alist</code></li><li>关闭: <code>systemctl stop alist</code></li><li>自启: <code>systemctl enable alist</code></li><li>状态: <code>systemctl status alist</code></li></ul><h4 id="使用mysql可选"><a class="markdownIt-Anchor" href="#使用mysql可选"></a> 使用mysql（可选）</h4><p>需要使用utf8mb4编码，修改database部分配置：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">database:</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">mysql</span></span><br><span class="line">  <span class="attr">user:</span> <span class="string">用户名</span></span><br><span class="line">  <span class="attr">password:</span> <span class="string">密码</span></span><br><span class="line">  <span class="attr">host:</span> <span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span></span><br><span class="line">  <span class="attr">port:</span> <span class="number">3306</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">数据库名</span></span><br></pre></td></tr></table></figure><h3 id="自定义静态资源服务器"><a class="markdownIt-Anchor" href="#自定义静态资源服务器"></a> 自定义静态资源服务器</h3><p>与使用gin作为静态资源服务器操作步骤差不多，不同的地方在于：</p><ul><li>下载<a class="link"   href="https://github.com/Xhofe/alist-web" >AList-web<i class="fas fa-external-link-alt"></i></a>的源码，修改<code>.env.production</code>中的<code>VUE_APP_API_URL</code>为具体部署的后端地址，然后<code>yarn &amp;&amp; yarn build</code>自行部署</li><li><code>conf.yml</code>中的<code>server.site_url</code>填写前端部署的域名或者默认为’*’，需要正确填写，否则会报错。</li><li>建议直接使用gin作为静态资源服务器，使用nginx的话因为路由使用了history模式（没有#号好看一点），所以还需要设置一下nginx：</li></ul><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">location</span> / &#123;</span><br><span class="line">  <span class="attribute">try_files</span> <span class="variable">$uri</span> <span class="variable">$uri</span>/ /index.html;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>参考：<a class="link"   href="https://router.vuejs.org/zh/guide/essentials/history-mode.html" >https://router.vuejs.org/zh/guide/essentials/history-mode.html<i class="fas fa-external-link-alt"></i></a></p><h3 id="反向代理"><a class="markdownIt-Anchor" href="#反向代理"></a> 反向代理</h3><p>程序默认监听5244端口，要实现https访问，需要使用nginx反向代理，在配置文件中加入</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">location</span> / &#123;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> Host <span class="variable">$http_host</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> X-Real-IP <span class="variable">$remote_addr</span>;</span><br><span class="line">    <span class="attribute">proxy_redirect</span> <span class="literal">off</span>;</span><br><span class="line">    <span class="attribute">proxy_pass</span> http://127.0.0.1:5244;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="常见问题解答"><a class="markdownIt-Anchor" href="#常见问题解答"></a> 常见问题解答</h1><ul><li>如何给文件夹设置密码？<br />在要加密的目录名称后面加上<code>.password-密码</code>，列表中会自动消除后面的密码部分。</li><li>如何隐藏文件夹<br />在要隐藏的文件夹名称后面加上<code>.hide</code>即可。</li><li>如何重建目录树<br />点击网页底部的rebuild按钮，输入配置文件中设置的server.password确定即可。</li><li>如何设置根目录？<br />修改配置文件中的<code>ali_drive.root_folder</code> 为想要设置的文件夹的<code>file_id</code>即可。文件夹的file_id是什么？根目录就是root，其他目录为点进文件夹之后的url中<code>folder/</code>后面那一串</li><li>如何自定义网页底部链接？<br />修改配置文件中的<code>footer_text</code>和<code>footer_url</code>为要设置的内容，或者不填则不会显示。</li><li>怎么复制文件直链？<br />点进文件，右上角有复制直链的按钮。</li><li>修改网站icon？<br />替换掉<code>dist</code>目录下的<code>favicon.ico</code>即可。</li><li>为什么新上传的文件不显示/删除了的文件还在？<br />列表展示的是本地数据库里的数据，更新文件之后需要重建。</li><li>如何更新？<br />前端：下载新的打包好的文件，删掉原来的dist文件夹，解压新的dist放入原来的位置即可。后端：<code>pkill alist</code> 停掉老的进程，删除旧的<code>alist</code>，下载新的alist，查看配置文件，补上新的配置项，再次运行即可。</li><li>运行显示检查更新之后直接报错？<br />可能是无法访问到GitHub的api，可以在命令行后面加上<code>-skip-update</code>跳过检查更新。</li><li>怎么指定路径重建？<br />在哪个路径点rebuild就是在哪里重建。</li><li>The input parameter limit is not valid. limit should be less than 200？<br /><a class="link"   href="https://github.com/Xhofe/alist-web/issues/22" >Xhofe/alist-web#22<i class="fas fa-external-link-alt"></i></a></li></ul><h1 id="buy-me-a-coffee"><a class="markdownIt-Anchor" href="#buy-me-a-coffee"></a> Buy me a coffee</h1><p>If you are using this project and happy with it or just want to encourage me to continue creating stuff,buy me a coffee by click <a class="link"   href="https://pay.xhofe.top" >this<i class="fas fa-external-link-alt"></i></a> 。Thanks：</p><ul><li><a class="link"   href="https://github.com/zsbai" >zsbai<i class="fas fa-external-link-alt"></i></a> ：请一杯奶茶?</li><li>白鹭</li><li>不知名</li><li>永胜</li><li>MFYDev</li><li>HakimYu</li><li>Moc̶k̶i̶n̶gbird</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;简介&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#简介&quot;&gt;&lt;/a&gt; 简介&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;此版本不再维护，请使用新版：&lt;a class=&quot;link&quot;   href=&quot;https://githu</summary>
      
    
    
    
    <category term="tutorials" scheme="https://nn.ci/categories/tutorials/"/>
    
    
    <category term="go" scheme="https://nn.ci/tags/go/"/>
    
    <category term="vue" scheme="https://nn.ci/tags/vue/"/>
    
    <category term="gin" scheme="https://nn.ci/tags/gin/"/>
    
    <category term="alist" scheme="https://nn.ci/tags/alist/"/>
    
    <category term="github" scheme="https://nn.ci/tags/github/"/>
    
  </entry>
  
  <entry>
    <title>mac应用推荐</title>
    <link href="https://nn.ci/posts/mac-software.html"/>
    <id>https://nn.ci/posts/mac-software.html</id>
    <published>2021-02-24T06:08:00.000Z</published>
    <updated>2021-02-24T06:08:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="软件下载网站"><a class="markdownIt-Anchor" href="#软件下载网站"></a> 软件下载网站</h1><ul><li>MacWk：<a class="link"   href="https://macwk.com/" >https://macwk.com/<i class="fas fa-external-link-alt"></i></a></li><li>XClient：<a class="link"   href="https://xclient.info/" >https://xclient.info/<i class="fas fa-external-link-alt"></i></a></li><li>AppKed：<a class="link"   href="https://www.macbed.com/" >https://www.macbed.com/<i class="fas fa-external-link-alt"></i></a></li></ul><h1 id="工具类"><a class="markdownIt-Anchor" href="#工具类"></a> 工具类</h1><h2 id="macos小助手"><a class="markdownIt-Anchor" href="#macos小助手"></a> macOS小助手</h2><ul><li><a class="link"   href="https://macwk.com/soft/macos-assistant-macwk" >https://macwk.com/soft/macos-assistant-macwk<i class="fas fa-external-link-alt"></i></a></li><li>macOS小助手 是 <a class="link"   href="http://MacWk.com" >MacWk.com<i class="fas fa-external-link-alt"></i></a> 编写的一个应用程序，可以帮您快速的进行一些操作，比如禁用macOS的 Gatekeeper（守门员）、修复macOS 10.15 应用已损坏问题、修改mac截图保存位置、修改截图名称前缀、修改截图默认保存格式、禁用窗口截图的阴影、开启单应用模式、查看SIP状态、禁用 macOS 更新提示（关闭macOS设置图标的小红点）。</li></ul><h2 id="mos"><a class="markdownIt-Anchor" href="#mos"></a> Mos</h2><ul><li><a class="link"   href="https://github.com/Caldis/Mos/" >https://github.com/Caldis/Mos/<i class="fas fa-external-link-alt"></i></a></li><li>一个用于在 macOS 上平滑你的鼠标滚动效果或单独设置滚动方向的小工具, 让你的滚轮爽如触控板</li></ul><h2 id="alfred4"><a class="markdownIt-Anchor" href="#alfred4"></a> Alfred4</h2><ul><li><a class="link"   href="https://macwk.com/soft/alfred-4" >https://macwk.com/soft/alfred-4<i class="fas fa-external-link-alt"></i></a></li><li>Alfred Powerpack 4 是一款本地搜索及快速启动工具，它可以帮你提高工作效率。alfred 4 可以快速的搜索本地应用、搜索本地文件、执行终端命令、翻译、文件管理、音乐控制等等！</li></ul><h2 id="mounty"><a class="markdownIt-Anchor" href="#mounty"></a> Mounty</h2><ul><li><a class="link"   href="https://mounty.app/" >https://mounty.app/<i class="fas fa-external-link-alt"></i></a></li><li>NTFS盘挂载</li></ul><h2 id="popclip"><a class="markdownIt-Anchor" href="#popclip"></a> Popclip</h2><ul><li><a class="link"   href="https://macwk.com/soft/popclip" >https://macwk.com/soft/popclip<i class="fas fa-external-link-alt"></i></a></li><li>PopClip 2020 破解版是一款划词工具。PopClip在Mac OS上对划词这个功能做了极大的增强，依附于各类小插件，我们能获得更多强大的功能来提升我们的操作效率。PopClip的核心其实在于扩展，上线快三年官方已经累计130多个常用的扩展。这还不包含Github上那些非官方的扩展们。</li></ul><h2 id="dozer"><a class="markdownIt-Anchor" href="#dozer"></a> Dozer</h2><ul><li><a class="link"   href="https://github.com/Mortennn/Dozer" >https://github.com/Mortennn/Dozer<i class="fas fa-external-link-alt"></i></a></li><li>Dozer 是一款隐藏macOS菜单栏图标的应用，不同于 Bartender 和 Vanilla，Dozer 是免费、开源的。Dozer 操作方法也很简单，Dozer运行后在菜单栏会出现一个「‧」，点击它，然后会出现另外一个「‧」，按住 <code>command</code> 键拖曳「‧」调整到适当位置，然后点击一下「‧」就会隐藏第一个「‧」左边的图标，重新显示也只需要点击「‧」即可。具体的大家可以上手体验一下，很简单的。</li></ul><h2 id="cheatsheet"><a class="markdownIt-Anchor" href="#cheatsheet"></a> CheatSheet</h2><ul><li><a class="link"   href="https://macwk.com/soft/cheatsheet" >https://macwk.com/soft/cheatsheet<i class="fas fa-external-link-alt"></i></a></li><li>CheatSheet 是一款可以快速查看mac应用快捷键的工具，你只需按住⌘键（command）几秒的时间，即可获得当前使用的应用程序所有的快捷组合列表。快捷键组合 列表窗口的右下角有个齿轮图标，可以设置呼出延时以及退出 CheatSheet。应用快捷键窗口中的名称是英文还是中文完全根据你使用的应用的语言决定。</li></ul><h2 id="iterm2"><a class="markdownIt-Anchor" href="#iterm2"></a> iTerm2</h2><ul><li><a class="link"   href="https://iterm2.com/" >https://iterm2.com/<i class="fas fa-external-link-alt"></i></a></li><li>iTerm2是Terminal的替代品，是iTerm的后继产品。 它适用于MacOS 10.14或更高版本的Mac。 iTerm2凭借您从未想过的功能将终端带入了现代时代。</li></ul><h2 id="fig"><a class="markdownIt-Anchor" href="#fig"></a> Fig</h2><ul><li><a class="link"   href="https://fig.io/" >https://fig.io/<i class="fas fa-external-link-alt"></i></a></li><li>With Fig, you can add autocomplete to any CLI tool or script using a declarative TypeScript schema.</li><li>下载：<a class="link"   href="https://fig.io/invite/?code=yuGMx8azXL" >https://fig.io/invite/?code=yuGMx8azXL<i class="fas fa-external-link-alt"></i></a></li></ul><h2 id="clashx"><a class="markdownIt-Anchor" href="#clashx"></a> ClashX</h2><ul><li><a class="link"   href="https://github.com/yichengchen/clashX/releases" >https://github.com/yichengchen/clashX/releases<i class="fas fa-external-link-alt"></i></a></li><li>A rule based proxy For Mac base on Clash.</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;软件下载网站&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#软件下载网站&quot;&gt;&lt;/a&gt; 软件下载网站&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;MacWk：&lt;a class=&quot;link&quot;   href=&quot;https://macwk.com/&quot; &gt;htt</summary>
      
    
    
    
    <category term="tools" scheme="https://nn.ci/categories/tools/"/>
    
    
    <category term="mac" scheme="https://nn.ci/tags/mac/"/>
    
  </entry>
  
  <entry>
    <title>常用命令与脚本收集</title>
    <link href="https://nn.ci/posts/commands-scripts.html"/>
    <id>https://nn.ci/posts/commands-scripts.html</id>
    <published>2021-01-27T06:08:00.000Z</published>
    <updated>2021-01-27T06:08:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="常用命令"><a class="markdownIt-Anchor" href="#常用命令"></a> 常用命令</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 赋予程序执行权限</span></span><br><span class="line"><span class="built_in">chmod</span> +x satrt</span><br><span class="line"><span class="comment"># 查看日志(最后50行)</span></span><br><span class="line"><span class="built_in">tail</span> -n 50 log.log</span><br><span class="line"><span class="comment"># 后台运行进程</span></span><br><span class="line"><span class="built_in">nohup</span> ./start &gt; log.log 2&gt;&amp;1 &amp;</span><br><span class="line"><span class="comment"># 根据进程名称杀进程</span></span><br><span class="line">pkill start</span><br><span class="line"><span class="comment"># 查看某个端口是否占用</span></span><br><span class="line">lsof -i:port</span><br><span class="line"><span class="comment"># 查看网络信息</span></span><br><span class="line">ip addr</span><br><span class="line">ifconfig</span><br><span class="line"><span class="comment"># 重启网络接口</span></span><br><span class="line">ifdown eth0 &amp;&amp; ifup eth0</span><br><span class="line"><span class="comment"># 测试磁盘I/O</span></span><br><span class="line"><span class="built_in">dd</span> <span class="keyword">if</span>=/dev/zero of=1GB.bin count=2048k conv=fsync</span><br><span class="line"><span class="built_in">dd</span> <span class="keyword">if</span>=/dev/sda of=/dev/null bs=4k</span><br></pre></td></tr></table></figure><h1 id="脚本收集"><a class="markdownIt-Anchor" href="#脚本收集"></a> 脚本收集</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 宝塔企业版(centos)开心版</span></span><br><span class="line">yum install -y wget &amp;&amp; wget -O install.sh https://download.fenhao.me/ltd/install/install_6.0.sh &amp;&amp; sh install.sh</span><br><span class="line"><span class="comment"># 宝塔专业版(centos)开心版</span></span><br><span class="line">yum install -y wget &amp;&amp; wget -O install.sh https://download.fenhao.me/install/install_6.0.sh &amp;&amp; sh install.sh</span><br><span class="line"><span class="comment"># BBR加速四合一</span></span><br><span class="line">wget -N --no-check-certificate <span class="string">&quot;https://raw.githubusercontent.com/chiakge/Linux-NetSpeed/master/tcp.sh&quot;</span> &amp;&amp; <span class="built_in">chmod</span> +x tcp.sh &amp;&amp; ./tcp.sh</span><br><span class="line"><span class="comment"># trojan多用户管理</span></span><br><span class="line"><span class="built_in">source</span> &lt;(curl -sL https://git.io/trojan-install)</span><br><span class="line"><span class="comment"># bench.sh</span></span><br><span class="line">wget -qO- bench.sh | bash</span><br><span class="line"><span class="comment"># 全国测速</span></span><br><span class="line">bash &lt;(curl -Lso- https://git.io/superspeed)</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;常用命令&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#常用命令&quot;&gt;&lt;/a&gt; 常用命令&lt;/h1&gt;
&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;sp</summary>
      
    
    
    
    <category term="tutorials" scheme="https://nn.ci/categories/tutorials/"/>
    
    
    <category term="commands" scheme="https://nn.ci/tags/commands/"/>
    
    <category term="scripts" scheme="https://nn.ci/tags/scripts/"/>
    
  </entry>
  
  <entry>
    <title>阿里云盘列表AList部署教程(V0)</title>
    <link href="https://nn.ci/posts/alist-v0.html"/>
    <id>https://nn.ci/posts/alist-v0.html</id>
    <published>2020-12-25T06:08:00.000Z</published>
    <updated>2020-12-25T06:08:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="简介"><a class="markdownIt-Anchor" href="#简介"></a> 简介</h1><blockquote><p><strong>此版本不再维护，请使用新版：<a class="link"   href="https://github.com/Xhofe/alist" >https://github.com/Xhofe/alist<i class="fas fa-external-link-alt"></i></a></strong><br />AList是一款阿里云盘的目录文件列表程序，后端基于<code>golang</code>最好的<code>http</code>框架<code>gin</code>，前端使用<code>vue</code>和<code>ant design</code>。没有专门学过前端，大佬轻喷?</p></blockquote><blockquote><p>暂时不会有太大的更新了，等阿里云盘正式发布之后再进行相关优化。更新计划：<a class="link"   href="https://www.notion.so/Todo-3fdc2b0deec340e9aa9d86e6f603df72%EF%BC%8C%E6%9C%89%E5%A5%BD%E7%9A%84%E5%BB%BA%E8%AE%AE%E5%8F%AF%E4%BB%A5%E8%AF%84%E8%AE%BA%E6%88%96%E5%9C%A8issue%E4%B8%AD%E5%91%8A%E8%AF%89%E6%88%91%E3%80%82" >https://www.notion.so/Todo-3fdc2b0deec340e9aa9d86e6f603df72，有好的建议可以评论或在issue中告诉我。<i class="fas fa-external-link-alt"></i></a></p></blockquote><p>测试了一下，在html文件头中加入<code>&lt;meta name=&quot;referrer&quot; content=&quot;never&quot;&gt;</code>，目前可以避开防盗链检测，后续未知。来自https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy , 若要使用程序作为图床，需要在img标签中加入<code>referrerPolicy=&quot;no-referrer&quot;</code>。<br /><s>由于阿里云盘加入了防盗链机制，目前所有不走服务器的预览均已失效，正在寻求解决办法，参考：<a class="link"   href="https://developer.aliyun.com/article/59499" >https://developer.aliyun.com/article/59499<i class="fas fa-external-link-alt"></i></a> 可能的方案：禁止浏览器的referer头，参考https://browsernative.com/http-referer-control-chrome/</s></p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;UTF-8&quot;</span>?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">Error</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">Code</span>&gt;</span>AccessDenied<span class="tag">&lt;/<span class="name">Code</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">Message</span>&gt;</span>You are denied by bucket referer policy.<span class="tag">&lt;/<span class="name">Message</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">RequestId</span>&gt;</span>5FFE96B83760853537D449EB<span class="tag">&lt;/<span class="name">RequestId</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">HostId</span>&gt;</span>bj29.cn-beijing.data.alicloudccp.com<span class="tag">&lt;/<span class="name">HostId</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">BucketName</span>&gt;</span>ccp-bj29-bj-1592982087<span class="tag">&lt;/<span class="name">BucketName</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">Error</span>&gt;</span></span><br></pre></td></tr></table></figure><p>本程序仅供学习研究使用！！！发现任何bug请提issue，部署上遇到问题欢迎添加我的qq<code>i@nn.ci</code>。<br />更新的时候后端和前端文件都需要替换！！！！以及补上配置文件新的配置项！！！！<br />更新的时候后端和前端文件都需要替换！！！！以及补上配置文件新的配置项！！！！<br />更新的时候后端和前端文件都需要替换！！！！以及补上配置文件新的配置项！！！！</p><h1 id="项目地址"><a class="markdownIt-Anchor" href="#项目地址"></a> 项目地址：</h1><ul><li><a class="link"   href="https://github.com/Xhofe/alist" >https://github.com/Xhofe/alist<i class="fas fa-external-link-alt"></i></a></li><li><a class="link"   href="https://github.com/Xhofe/alist-web" >https://github.com/Xhofe/alist-web<i class="fas fa-external-link-alt"></i></a></li></ul><h1 id="更新"><a class="markdownIt-Anchor" href="#更新"></a> 更新</h1><h2 id="2021122"><a class="markdownIt-Anchor" href="#2021122"></a> 2021.1.22</h2><ul><li>使用阿里云提供的文档预览服务</li><li>解决阿里云盘防盗链问题</li><li>修复观看视频时返回播放器不销毁的bug</li><li>优化了一些代码</li></ul><h2 id="2021112"><a class="markdownIt-Anchor" href="#2021112"></a> 2021.1.12</h2><ul><li>修复安卓微信端左侧被裁切的问题</li><li>更新dplayer至最新版本</li><li>优化跨域/信任域名，隐藏了一些配置信息</li><li>修改meta信息中的语言为中文（不会弹出翻译）</li><li>优化版本号比较</li></ul><h2 id="202116"><a class="markdownIt-Anchor" href="#202116"></a> 2021.1.6</h2><ul><li>前端了去除了map文件，减小了打包后的文件体积，仅有原来的1/3</li><li>增加了文档文件的预览，使用了<a class="link"   href="https://kkfileview.keking.cn/zh-cn/index.html" >kkFileView<i class="fas fa-external-link-alt"></i></a>，部署在比较辣鸡的机器上，有能力可以自行搭建</li><li>增加了几乎所有文本文件的预览，可自行修改需要预览的后缀</li><li>可自定义视频自动播放</li><li>修改了移动端（宽度小于600px）时的视频高度</li><li>更换了二维码接口，原来的有时候特别慢</li></ul><h2 id="20201231"><a class="markdownIt-Anchor" href="#20201231"></a> 2020.12.31</h2><ul><li>自定义脚本</li><li>移动端文件列表优化</li><li>二维码分享(只在宽度小于600px的设备上显示)</li><li>去除对文件请求的缓存</li><li>更新提醒(可在配置文件中关闭)</li></ul><h2 id="20201229"><a class="markdownIt-Anchor" href="#20201229"></a> 2020.12.29</h2><ul><li>引入缓存，大幅优化了响应速度</li></ul><h2 id="20201228"><a class="markdownIt-Anchor" href="#20201228"></a> 2020.12.28</h2><ul><li>自定义页面底部链接</li><li>301跳转文件直链</li><li>体验优化</li><li>隐藏.password密码文件</li><li>json绑定出错问题</li></ul><h1 id="预览"><a class="markdownIt-Anchor" href="#预览"></a> 预览</h1><ul><li><a class="link"   href="https://alist.nn.ci" >https://alist.nn.ci<i class="fas fa-external-link-alt"></i></a> (稳定版本,即Github Release的最新版本)</li><li><a class="link"   href="https://alist.now.sh" >https://alist.now.sh<i class="fas fa-external-link-alt"></i></a> (开发版本,随着GitHub提交更新)</li></ul><p><img                       lazyload                     src="/images/loading.svg"                     data-src="alist-v0/d81d2dab3e5f0.png"                      alt="alist预览"                 ></p><h1 id="如何部署"><a class="markdownIt-Anchor" href="#如何部署"></a> 如何部署</h1><p>首先第一步，Star本项目<a class="link"   href="https://github.com/Xhofe/alist" >AList<i class="fas fa-external-link-alt"></i></a>(bushi</p><h2 id="获取refresh_token"><a class="markdownIt-Anchor" href="#获取refresh_token"></a> 获取<code>refresh_token</code></h2><p>为什么不直接使用<code>access_token</code>，因为有效期只有两小时。</p><p>经<a class="link"   href="https://www.hostloc.com/space-uid-22146.html" >Syc<i class="fas fa-external-link-alt"></i></a>大佬的提醒，获取<code>refresh_token</code>其实没这么麻烦，我们只需要登陆阿里云盘之后，打开开发者工具，切换到<code>Application</code>选项卡，点开<code>Local storage</code>,会有一个<code>token</code>项，点开就可以看到<code>refresh_token</code>了，此处感谢一下<a class="link"   href="https://www.hostloc.com/space-uid-22146.html" >Syc<i class="fas fa-external-link-alt"></i></a>大佬。</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://img.xhofe.top/2020/12/26/de89d8acdcd75.png"                      alt="请输入图片描述"                 ></p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># 过时内容</span></span><br><span class="line"><span class="quote">&gt; 刚想起来忘记去掉自己博客的链接了?，下个版本去掉，或者自定义</span></span><br><span class="line"><span class="quote">&gt; 如果启动时遇到`json:cannot unmarshal number into Go...`的问题，请先尝试使用[<span class="string">开发版本</span>][<span class="symbol">7</span>]</span></span><br><span class="line"></span><br><span class="line">首先第一步需要获取<span class="code">`refresh_token`</span>，这也是部署过程中最麻烦的一步。我尝试过直接通过login<span class="emphasis">_token去登陆获取，但是会得到这个错误：</span></span><br><span class="line"><span class="emphasis">&gt; User not authorized to operate on the specified APIs you need access by oauth.</span></span><br><span class="line"><span class="emphasis">知道如何破解的大佬，欢迎发起pr?或者在issues中告诉我。所以，现在还是先获取`refresh_</span>token`吧。</span><br><span class="line"><span class="bullet">-</span> 进入阿里云盘登录页，打开开发者工具，并开启Preserve log：</span><br><span class="line">![<span class="string">打开控制台</span>][<span class="symbol">8</span>]</span><br><span class="line"><span class="bullet">-</span> 选择一种方式登录，我这里选择的是扫码其他的应该也差不多</span><br><span class="line"><span class="bullet">-</span> 找到<span class="code">`https://auth.aliyundrive.com/v2/oauth/token_login`</span>这个请求并复制请求中的token</span><br><span class="line">![<span class="string">获取login_token</span>][<span class="symbol">9</span>]</span><br><span class="line"><span class="bullet">-</span> 这是我们就需要一个模拟请求插件，这里我使用的是[<span class="string">Postwomen</span>][<span class="symbol">10</span>],用刚刚复制的数据再次请求这个接口</span><br><span class="line">![<span class="string">token_login</span>][<span class="symbol">11</span>]</span><br><span class="line"><span class="bullet">-</span> 然后我们就会得到一个goto的链接（在控制台就是看不到，是真滴奇怪，如果可以看到就没这么麻烦了），链接中有个code参数，我们再次复制它，然后用这个code请求<span class="code">`https://websv.aliyundrive.com/token/get`</span>这个接口，注意这个code只能使用一次，所以这里没有打码了?</span><br><span class="line">![<span class="string">token_get</span>][<span class="symbol">12</span>]</span><br><span class="line"><span class="bullet">-</span> 大功告成，终于得到这个<span class="code">`refresh_token`</span>了，保存好它，然后就可以开始接下来的步骤了。</span><br></pre></td></tr></table></figure><h2 id="部署"><a class="markdownIt-Anchor" href="#部署"></a> 部署</h2><h3 id="使用gin作为静态资源服务器"><a class="markdownIt-Anchor" href="#使用gin作为静态资源服务器"></a> 使用gin作为静态资源服务器</h3><ul><li>前往<a class="link"   href="https://github.com/Xhofe/alist/releases" >AList Release<i class="fas fa-external-link-alt"></i></a>下载对应系统的程序，解压得到一个运行文件<code>alist</code></li><li>前往<a class="link"   href="https://github.com/Xhofe/alist-web/releases" >AList-web<i class="fas fa-external-link-alt"></i></a>下载打包好的前端，解压得到一个dist目录放到<code>alist</code>同级目录下</li><li>在同级目录下新建一个配置文件<code>conf.yml</code>，复制以下内容到该文件中：</li></ul><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">info:</span></span><br><span class="line">  <span class="attr">title:</span> <span class="string">AList</span> <span class="comment">#网站名称，如果填写，则会替换掉默认的</span></span><br><span class="line">  <span class="attr">logo:</span> <span class="comment">#网站logo，如果填写，则会替换掉默认的</span></span><br><span class="line">  <span class="attr">footer_text:</span> <span class="string">&quot;Xhofe&#x27;s Blog&quot;</span> <span class="comment">#网页底部文字</span></span><br><span class="line">  <span class="attr">footer_url:</span> <span class="string">https://www.nn.ci</span> <span class="comment">#网页底部文字链接</span></span><br><span class="line">  <span class="attr">music_img:</span> <span class="string">https://img.xhofe.top/2020/12/19/0f8b57866bdb5.gif</span> <span class="comment">#预览音乐文件时的图片</span></span><br><span class="line">  <span class="attr">check_update:</span> <span class="literal">true</span> <span class="comment">#前端是否显示更新</span></span><br><span class="line">  <span class="attr">script:</span> <span class="comment">#自定义js脚本,可以是脚本的链接，也可以直接是脚本内容,如document.querySelector(&#x27;body&#x27;).style=&quot;background-image:url(&#x27;https://api.mtyqx.cn/api/random.php&#x27;);background-attachment:fixed&quot;</span></span><br><span class="line">  <span class="attr">autoplay:</span> <span class="literal">true</span> <span class="comment">#视频是否自动播放</span></span><br><span class="line">  <span class="attr">preview:</span></span><br><span class="line">    <span class="attr">url:</span> <span class="string">https://view.alist.nn.ci/onlinePreview?url=</span> <span class="comment">#extensions中包含的后缀名预览的地址，默认使用了kkFileView，可以自行搭建</span></span><br><span class="line">    <span class="attr">pre_process:</span> [<span class="string">base64</span>,<span class="string">encodeURIComponent</span>] <span class="comment">#对地址的处理，支持base64,encodeURIComponent,encodeURI</span></span><br><span class="line">    <span class="attr">extensions:</span> [] <span class="comment">#使用上面的url预览的文件后缀</span></span><br><span class="line">    <span class="attr">text:</span> [<span class="string">txt</span>,<span class="string">htm</span>,<span class="string">html</span>,<span class="string">xml</span>,<span class="string">java</span>,<span class="string">properties</span>,<span class="string">sql</span>,<span class="string">js</span>,<span class="string">md</span>,<span class="string">json</span>,<span class="string">conf</span>,<span class="string">ini</span>,<span class="string">vue</span>,<span class="string">php</span>,<span class="string">py</span>,<span class="string">bat</span>,<span class="string">gitignore</span>,<span class="string">yml</span>,<span class="string">go</span>,<span class="string">sh</span>,<span class="string">c</span>,<span class="string">cpp</span>,<span class="string">h</span>,<span class="string">hpp</span>] <span class="comment">#要预览的文本文件的后缀，可以自行添加</span></span><br><span class="line">    <span class="attr">max_size:</span> <span class="number">5242880</span></span><br><span class="line"><span class="attr">server:</span></span><br><span class="line">  <span class="attr">port:</span> <span class="string">&quot;5244&quot;</span> <span class="comment">#程序监听端口</span></span><br><span class="line">  <span class="attr">search:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">static:</span> <span class="string">dist</span></span><br><span class="line">  <span class="attr">site_url:</span> <span class="string">&#x27;*&#x27;</span> <span class="comment">#建议直接填*,若有信任域名要求,可填写其他具体域名,逗号分割</span></span><br><span class="line"><span class="attr">cache:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span> <span class="comment">#是否开启缓存</span></span><br><span class="line">  <span class="attr">expiration:</span> <span class="number">60</span> <span class="comment">#缓存失效时间(单位:分钟)</span></span><br><span class="line">  <span class="attr">cleanup_interval:</span> <span class="number">120</span> <span class="comment">#清理失效缓存间隔</span></span><br><span class="line">  <span class="attr">refresh_password:</span> <span class="string">password</span> <span class="comment">#手动清理缓存密码</span></span><br><span class="line"><span class="attr">ali_drive:</span></span><br><span class="line">  <span class="attr">api_url:</span> <span class="string">https://api.aliyundrive.com/v2</span></span><br><span class="line">  <span class="attr">root_folder:</span> <span class="string">root</span> <span class="comment">#根目录</span></span><br><span class="line">  <span class="attr">refresh_token:</span> <span class="comment">#必填！！！</span></span><br><span class="line">  <span class="attr">max_files_count:</span> <span class="number">3000</span> <span class="comment">#一次性最大文件数量</span></span><br></pre></td></tr></table></figure><ul><li>填入最开始获取到的<code>refresh_token</code>，然后自行修改配置文件中默认的值</li><li>现在的情况应该是，目录下有两个文件<code>alist</code>、<code>conf.yml</code>和一个文件夹<code>dist</code>，在该文件夹下面执行下面的命令（Linux）</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">chmod</span> +x alist</span><br><span class="line"><span class="built_in">nohup</span> ./alist &gt; log.log 2&gt;&amp;1 &amp;</span><br></pre></td></tr></table></figure><p>ok，程序已经跑起来了。你可以<code>cat log.log</code>看看有没有报错。或者访问http://ip:5244进行查看。</p><h3 id="自定义静态资源服务器"><a class="markdownIt-Anchor" href="#自定义静态资源服务器"></a> 自定义静态资源服务器</h3><p>与使用gin作为静态资源服务器操作步骤差不多，不同的地方在于：</p><ul><li>下载<a class="link"   href="https://github.com/Xhofe/alist-web" >AList-web<i class="fas fa-external-link-alt"></i></a>的源码，修改<code>.env.production</code>中的<code>VUE_APP_API_URL</code>为具体部署的后端地址，然后<code>yarn &amp;&amp; yarn build</code>自行部署</li><li><code>conf.yml</code>中的<code>server.site_url</code>填写前端部署的域名或者默认为’*’，需要正确填写，否则会报错。</li><li>建议直接使用gin作为静态资源服务器，使用nginx的话因为路由使用了history模式（没有#号好看一点），所以还需要设置一下nginx：</li></ul><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">location</span> <span class="string">/</span> &#123;</span><br><span class="line">  <span class="string">try_files</span> <span class="string">$uri</span> <span class="string">$uri/</span> <span class="string">/index.html;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>参考：<a class="link"   href="https://router.vuejs.org/zh/guide/essentials/history-mode.html" >https://router.vuejs.org/zh/guide/essentials/history-mode.html<i class="fas fa-external-link-alt"></i></a></p><h3 id="反向代理"><a class="markdownIt-Anchor" href="#反向代理"></a> 反向代理</h3><p>程序默认监听5244端口，要实现https访问，需要使用nginx反向代理，在配置文件中加入</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">location / &#123;</span><br><span class="line">    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line">    proxy_set_header Host $http_host;</span><br><span class="line">    proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line">    proxy_redirect off;</span><br><span class="line">    proxy_pass http://127.0.0.1:5244;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="常见问题解答"><a class="markdownIt-Anchor" href="#常见问题解答"></a> 常见问题解答</h1><ul><li>如何给文件夹设置密码？<br />在要加密的目录下新建一个名称为<code>.password-要设置的密码</code>的文件或者文件夹就可以了。</li><li>如何设置根目录？<br />修改配置文件中的<code>ali_drive.root_folder</code> 为想要设置的文件夹的<code>file_id</code>即可。</li><li>如何自定义网页底部链接？<br />修改配置文件中的<code>footer_text</code>和<code>footer_url</code>为要设置的内容，或者不填则不会显示。</li><li>怎么复制文件直链？<br />进入文件预览，可以预览的文件复制按钮在右上角，不可预览的复制按钮在正中间。</li><li>修改网站icon？<br />替换掉<code>dist</code>目录下的<code>favicon.ico</code>即可。</li><li>为什么新上传的文件不显示/删除了的文件还在？<br />为了提高响应速度，对文件的列表是有缓存的，默认开启。</li><li>如何开关缓存？<br />配置文件中的<code>cache.enable</code>设置为<code>true</code>或<code>false</code>即可，打开会占用更多的内存，但会大幅优化使用体验，默认打开。经测试下载地址是会失效的，所以请自行设置缓存的时间。下个版本将给文件去掉缓存，只缓存文件夹。更新文件的时候可以手动刷新缓存。</li><li>如何刷新缓存？<br />程序会自动按照配置文件中的<code>cache.cleanup_interval</code>自动清理过期缓存，如需手动刷新，手动访问<code>后端地址/cache/配置文件中设置的刷新密码</code>，如<code>https://alist.nn.ci/cache/alist</code>。</li><li>如何更新？<br />前端：下载新的打包好的文件，删掉原来的dist文件夹，解压新的dist放入原来的位置即可。后端：<code>pkill alist</code> 停掉老的进程，删除旧的<code>alist</code>，下载新的alist，查看配置文件，补上新的配置项，再次运行即可。</li><li>要安装<code>Windows</code>版本？<br />自行编译，或者在<a class="link"   href="https://github.com/Xhofe/alist/actions?query=workflow%3Abuild" >Github Actions<i class="fas fa-external-link-alt"></i></a>可以找到每次提交的build。</li></ul><h1 id="buy-me-a-coffee"><a class="markdownIt-Anchor" href="#buy-me-a-coffee"></a> Buy me a coffee</h1><p>If you are using this project and happy with it or just want to encourage me to continue creating stuff,buy me a coffee by click <a class="link"   href="https://pay.xhofe.top" >this<i class="fas fa-external-link-alt"></i></a> 。Thanks：</p><ul><li><a class="link"   href="https://github.com/zsbai" >zsbai<i class="fas fa-external-link-alt"></i></a> ：请一杯奶茶?</li><li>白鹭</li><li>不知名</li><li>永胜</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;简介&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#简介&quot;&gt;&lt;/a&gt; 简介&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;此版本不再维护，请使用新版：&lt;a class=&quot;link&quot;   href=&quot;https://githu</summary>
      
    
    
    
    <category term="tutorials" scheme="https://nn.ci/categories/tutorials/"/>
    
    
    <category term="go" scheme="https://nn.ci/tags/go/"/>
    
    <category term="vue" scheme="https://nn.ci/tags/vue/"/>
    
    <category term="gin" scheme="https://nn.ci/tags/gin/"/>
    
    <category term="alist" scheme="https://nn.ci/tags/alist/"/>
    
  </entry>
  
  <entry>
    <title>使用Jmeter接口进行Java二次开发(Socket-TCP)</title>
    <link href="https://nn.ci/posts/jmeter-tcp-dev.html"/>
    <id>https://nn.ci/posts/jmeter-tcp-dev.html</id>
    <published>2020-12-03T03:30:00.000Z</published>
    <updated>2020-12-03T03:30:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="jmeter-是什么"><a class="markdownIt-Anchor" href="#jmeter-是什么"></a> Jmeter 是什么？</h1><blockquote><p>Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试，它最初被设计用于Web应用测试，但后来扩展到其他测试领域。 它可以用于测试静态和动态资源，例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器， 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载，来自不同压力类别下测试它们的强度和分析整体性能。另外，JMeter能够对应用程序做功能/回归测试，通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性，JMeter允许使用正则表达式创建断言。</p></blockquote><h1 id="为什么要进行二次插件开发"><a class="markdownIt-Anchor" href="#为什么要进行二次插件开发"></a> 为什么要进行二次插件开发</h1><p>因为有时候自带的取样器无法满足我们的需求，我们需要自己定义就需要进行二次插件开发了，其实这个开发的流程也非常的简单，只需要实现其中几个接口就可以了。<br />例如Jmeter自带的TCP取样器的行尾（EOL字节值）只能设置的范围只能是[-128,127]，判断行结束的byte值，如果你指定的值大于127或者小于-128，则会跳过EOL检测，这样TCP就无法自动断开连接直至超时判断失败。<br />所以我们需要进行自定义的TCP取样器。</p><h1 id="二次开发的步骤"><a class="markdownIt-Anchor" href="#二次开发的步骤"></a> 二次开发的步骤</h1><ul><li>首先使用IDEA新建普通java项目</li><li>将<code>jmeter</code>的<code>lib/ext</code>目录下的<code>ApacheJMeter_core.jar</code>和<code>ApacheJMeter_java.jar</code>两个jar包引入</li><li>新建一个类实现<code>JavaSamplerClient</code>接口：<ul><li>getDefaultParameters：设置默认参数</li><li>setupTest：测试前做的事</li><li>runTest：测试时主要做的事</li><li>teardownTest：测试后做的事，一般不做设置</li></ul></li></ul><h2 id="runtest"><a class="markdownIt-Anchor" href="#runtest"></a> runTest</h2><p>runTest就是主要的测试逻辑部分，在这个函数中，我们需要记录开始于结束的时间，设置测试的标签和结果以及response等等。</p><h2 id="code"><a class="markdownIt-Anchor" href="#code"></a> code</h2><p>我这里主要实现的就是一个发送自定义的16进制TCP报文并检测一次回复的报文尾部转换之后是否为指定字符串。</p><p>[tag type=“default”]SocketTest[/tag]类，主要的取样器类：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> top.xhofe;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.apache.jmeter.config.Arguments;</span><br><span class="line"><span class="keyword">import</span> org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;</span><br><span class="line"><span class="keyword">import</span> org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;</span><br><span class="line"><span class="keyword">import</span> org.apache.jmeter.samplers.SampleResult;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.OutputStream;</span><br><span class="line"><span class="keyword">import</span> java.net.Socket;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Xhofe</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SocketTest</span> <span class="keyword">implements</span> <span class="title class_">JavaSamplerClient</span> &#123;</span><br><span class="line">    <span class="keyword">private</span> SampleResult result;</span><br><span class="line">    <span class="keyword">private</span> String host;</span><br><span class="line">    <span class="keyword">private</span> <span class="type">int</span> port;</span><br><span class="line">    <span class="keyword">private</span> String content;</span><br><span class="line">    <span class="keyword">private</span> String end;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setupTest</span><span class="params">(JavaSamplerContext javaSamplerContext)</span> &#123;</span><br><span class="line">        result=<span class="keyword">new</span> <span class="title class_">SampleResult</span>();</span><br><span class="line">        host=javaSamplerContext.getParameter(<span class="string">&quot;host&quot;</span>);</span><br><span class="line">        port=Integer.parseInt(javaSamplerContext.getParameter(<span class="string">&quot;port&quot;</span>));</span><br><span class="line">        content=javaSamplerContext.getParameter(<span class="string">&quot;content&quot;</span>);</span><br><span class="line">        end=javaSamplerContext.getParameter(<span class="string">&quot;end&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> SampleResult <span class="title function_">runTest</span><span class="params">(JavaSamplerContext javaSamplerContext)</span> &#123;</span><br><span class="line">        String threadName=Thread.currentThread().getName();</span><br><span class="line">        result.setSampleLabel(threadName);</span><br><span class="line">        result.setSamplerData(<span class="string">&quot;TCP发送:&quot;</span>+host+<span class="string">&quot;:&quot;</span>+port+<span class="string">&quot;数据:&quot;</span>+content);</span><br><span class="line">        result.sampleStart();</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            Socket socket=<span class="keyword">new</span> <span class="title class_">Socket</span>(host,port);</span><br><span class="line">            OutputStream out=socket.getOutputStream();</span><br><span class="line">            <span class="type">byte</span>[] hexStrToByteArr = Utils.hexStrToByteArr(content);</span><br><span class="line">            <span class="keyword">if</span> (hexStrToByteArr==<span class="literal">null</span>)&#123;</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">Exception</span>(<span class="string">&quot;hexStrToByteArr error&quot;</span>);</span><br><span class="line">            &#125;</span><br><span class="line">            out.write(hexStrToByteArr);</span><br><span class="line">            InputStream in=socket.getInputStream();</span><br><span class="line">            <span class="type">byte</span>[] buf=<span class="keyword">new</span> <span class="title class_">byte</span>[<span class="number">1024</span>];</span><br><span class="line">            <span class="type">int</span> len=in.read(buf);</span><br><span class="line">            String response=Utils.bytesToHexString(buf,len);</span><br><span class="line">            result.setResponseData(response,<span class="string">&quot;UTF-8&quot;</span>);</span><br><span class="line">            socket.close();</span><br><span class="line">            <span class="keyword">if</span> (!response.endsWith(end))&#123;</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">Exception</span>(<span class="string">&quot;response:&quot;</span>+response+<span class="string">&quot;not ends with:&quot;</span>+end);</span><br><span class="line">            &#125;</span><br><span class="line">            result.setSuccessful(<span class="literal">true</span>);</span><br><span class="line">        &#125;<span class="keyword">catch</span> (Exception e)&#123;</span><br><span class="line">            result.setSuccessful(<span class="literal">false</span>);</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;<span class="keyword">finally</span> &#123;</span><br><span class="line">            result.sampleEnd();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> result;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">teardownTest</span><span class="params">(JavaSamplerContext javaSamplerContext)</span> &#123;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> Arguments <span class="title function_">getDefaultParameters</span><span class="params">()</span> &#123;</span><br><span class="line">        Arguments params=<span class="keyword">new</span> <span class="title class_">Arguments</span>();</span><br><span class="line">        params.addArgument(<span class="string">&quot;host&quot;</span>,<span class="string">&quot;tcp.xhofe.top&quot;</span>);</span><br><span class="line">        params.addArgument(<span class="string">&quot;port&quot;</span>,<span class="string">&quot;9999&quot;</span>);</span><br><span class="line">        params.addArgument(<span class="string">&quot;end&quot;</span>,<span class="string">&quot;FB&quot;</span>)  ;</span><br><span class="line">        params.addArgument(<span class="string">&quot;content&quot;</span>,<span class="string">&quot;fa120106009a6946401000010077036a65b4002202175e4c00002f5b00002f5b00002f5b09080908007d04dd0bc3000000000175d3f077ca01f9000c000f0055006401f9004d001907e707de04bc000007de04bc000050643201fb&quot;</span>);</span><br><span class="line">        <span class="keyword">return</span> params;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>[tag type=“success”]Utils[/tag]工具类，用于转换字符串和十六进制的转换：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> top.xhofe;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Xhofe</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Utils</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">byte</span>[] hexStrToByteArr(String hexString) &#123;</span><br><span class="line">        <span class="keyword">if</span> (hexString==<span class="literal">null</span>||hexString.isEmpty()) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        hexString = hexString.replaceAll(<span class="string">&quot; &quot;</span>, <span class="string">&quot;&quot;</span>);</span><br><span class="line">        <span class="type">int</span> <span class="variable">len</span> <span class="operator">=</span> hexString.length();</span><br><span class="line">        <span class="type">int</span> <span class="variable">index</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">        <span class="type">byte</span>[] bytes = <span class="keyword">new</span> <span class="title class_">byte</span>[len / <span class="number">2</span>];</span><br><span class="line"></span><br><span class="line">        <span class="keyword">while</span> (index &lt; len) &#123;</span><br><span class="line">            <span class="type">String</span> <span class="variable">sub</span> <span class="operator">=</span> hexString.substring(index, index + <span class="number">2</span>);</span><br><span class="line">            bytes[index / <span class="number">2</span>] = (<span class="type">byte</span>) Integer.parseInt(sub, <span class="number">16</span>);</span><br><span class="line">            index += <span class="number">2</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> bytes;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">bytesToHexString</span><span class="params">(<span class="type">byte</span>[] bArray,<span class="type">int</span> len)</span> &#123;</span><br><span class="line">        <span class="type">StringBuilder</span> <span class="variable">sb</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuilder</span>(len);</span><br><span class="line">        String sTemp;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; len; i++) &#123;</span><br><span class="line">            sTemp = Integer.toHexString(<span class="number">0xFF</span> &amp; bArray[i]);</span><br><span class="line">            <span class="keyword">if</span> (sTemp.length() &lt; <span class="number">2</span>) &#123;</span><br><span class="line">                sb.append(<span class="number">0</span>);</span><br><span class="line">            &#125;</span><br><span class="line">            sb.append(sTemp.toUpperCase());</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> sb.toString();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><ul><li>将代码打包成Jar包（此处不赘述）</li><li>将打包好的Jar包放到jmeter根目录/lib/ext目录下</li><li>Jmeter添加线程组-&gt;添加取样器-Java请求-&gt;选择自定义的类-&gt;设置参数/使用默认的参数</li><li>OK，完成！</li></ul><h1 id="参考"><a class="markdownIt-Anchor" href="#参考"></a> 参考</h1><p><a class="link"   href="https://zhuanlan.zhihu.com/p/85985170" >五步教你如何去做jmeter接口java二次开发<i class="fas fa-external-link-alt"></i></a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;jmeter-是什么&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#jmeter-是什么&quot;&gt;&lt;/a&gt; Jmeter 是什么？&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Apache JMeter是Apache组织开发的基于Java的压力</summary>
      
    
    
    
    <category term="tutorials" scheme="https://nn.ci/categories/tutorials/"/>
    
    
    <category term="java" scheme="https://nn.ci/tags/java/"/>
    
    <category term="jmeter" scheme="https://nn.ci/tags/jmeter/"/>
    
    <category term="tcp" scheme="https://nn.ci/tags/tcp/"/>
    
  </entry>
  
  <entry>
    <title>go实现一个极简的短链接服务</title>
    <link href="https://nn.ci/posts/go-shorturl.html"/>
    <id>https://nn.ci/posts/go-shorturl.html</id>
    <published>2020-12-01T06:08:00.000Z</published>
    <updated>2020-12-01T06:08:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>首先放一下<a class="link"   href="http://github.com/Xhofe/oez" >Github-OEZ<i class="fas fa-external-link-alt"></i></a></p><h1 id="短链接原理"><a class="markdownIt-Anchor" href="#短链接原理"></a> 短链接原理</h1><p>原理其实很简单，前端给后端传一个字符串，然后根据这个字符串找到原网址，最后返回一个301即可。所以短网址算法主要就是研究如何根据原网址算出这个字符串以及如何根据字符串找到这个网址。</p><h1 id="短链接算法"><a class="markdownIt-Anchor" href="#短链接算法"></a> 短链接算法</h1><p>常用的短链接算法主要有两种：自增ID和哈希</p><h2 id="哈希"><a class="markdownIt-Anchor" href="#哈希"></a> 哈希</h2><p>顾名思义，哈希就是将原网址计算出一个哈希字符串，但是这种算法碰到哈希碰撞时，会存在重复的情况，这个时候就有可能需要再哈希或者进行其他的处理。</p><h2 id="自增id"><a class="markdownIt-Anchor" href="#自增id"></a> 自增ID</h2><p>所以这里我们选择使用自增ID的方法，我们先将原网址存入数据，然后使用数据库返回的id，将id换算成六十二进制的字符串（随机的大小写字母+数字），数据库也不需要存储这个字符串，直接返回给前端即可。当前端请求这个字符串时，再转成十进制的id即可找到原网址。go进制转换与随机62进制字符串代码：</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">&quot;io&quot;</span></span><br><span class="line"><span class="string">&quot;log&quot;</span></span><br><span class="line"><span class="string">&quot;math&quot;</span></span><br><span class="line"><span class="string">&quot;math/rand&quot;</span></span><br><span class="line"><span class="string">&quot;os&quot;</span></span><br><span class="line"><span class="string">&quot;path/filepath&quot;</span></span><br><span class="line"><span class="string">&quot;regexp&quot;</span></span><br><span class="line"><span class="string">&quot;strings&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> CHARS = <span class="string">&quot;InsV3Sf0obzp2i4gj1yYGqQv6wUtmBxlMAP7KHd8uTXFk9aRJWNC5EOhZDcLer&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> (</span><br><span class="line"><span class="comment">// 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</span></span><br><span class="line">SCALE = <span class="number">62</span></span><br><span class="line">REGEX = <span class="string">&quot;^[0-9a-zA-Z]+$&quot;</span></span><br><span class="line">NUM = <span class="number">6</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">RandomStr</span><span class="params">(str <span class="type">string</span>)</span></span> <span class="type">string</span> &#123;</span><br><span class="line">chars := []<span class="type">rune</span>(str)</span><br><span class="line"><span class="keyword">for</span> i := <span class="built_in">len</span>(chars) - <span class="number">1</span>; i &gt; <span class="number">0</span>; i-- &#123;</span><br><span class="line">num := rand.Intn(i + <span class="number">1</span>)</span><br><span class="line">chars[i], chars[num] = chars[num], chars[i]</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="type">string</span>(chars)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">Encode10To62</span><span class="params">(val <span class="type">uint</span>)</span></span> <span class="type">string</span> &#123;</span><br><span class="line"><span class="keyword">if</span> val &lt; <span class="number">0</span> &#123;</span><br><span class="line"><span class="built_in">panic</span>(<span class="string">&quot;val cannot be negative.&quot;</span>)</span><br><span class="line">&#125;</span><br><span class="line">str := <span class="string">&quot;&quot;</span></span><br><span class="line"><span class="keyword">var</span> remainder <span class="type">int</span></span><br><span class="line"><span class="keyword">for</span> math.Abs(<span class="type">float64</span>(val)) &gt; SCALE<span class="number">-1</span> &#123;</span><br><span class="line">remainder = <span class="type">int</span>(val % SCALE)</span><br><span class="line">str = <span class="type">string</span>(CHARS[remainder]) + str</span><br><span class="line">val = val / SCALE</span><br><span class="line">&#125;</span><br><span class="line">str = <span class="type">string</span>(CHARS[val]) + str</span><br><span class="line"><span class="comment">//for i := len(str); i &lt; NUM; i++ &#123;</span></span><br><span class="line"><span class="comment">//str = string(CHARS[0]) + str</span></span><br><span class="line"><span class="comment">//&#125;</span></span><br><span class="line"><span class="keyword">return</span> str</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">Decode62To10</span><span class="params">(val <span class="type">string</span>)</span></span> <span class="type">uint</span> &#123;</span><br><span class="line"><span class="keyword">if</span> match, _ := regexp.MatchString(REGEX, val); !match &#123;</span><br><span class="line"><span class="built_in">panic</span>(<span class="string">&quot;input illegal.&quot;</span>)</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">var</span> result <span class="type">uint</span> = <span class="number">0</span></span><br><span class="line">index, length := <span class="number">0</span>, <span class="built_in">len</span>(val)</span><br><span class="line"><span class="keyword">for</span> i := <span class="number">0</span>; i &lt; length; i++ &#123;</span><br><span class="line">index = strings.Index(CHARS, <span class="type">string</span>(val[i]))</span><br><span class="line">result += <span class="type">uint</span>(index * <span class="type">int</span>(math.Pow(<span class="type">float64</span>(SCALE), <span class="type">float64</span>(length-i<span class="number">-1</span>))))</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> result</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="demo"><a class="markdownIt-Anchor" href="#demo"></a> Demo</h1><p><a class="link"   href="https://oez.cc" >Oh,easy!<i class="fas fa-external-link-alt"></i></a><br />支持API调用与添加书签栏快捷缩短。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;首先放一下&lt;a class=&quot;link&quot;   href=&quot;http://github.com/Xhofe/oez&quot; &gt;Github-OEZ&lt;i class=&quot;fas fa-external-link-alt&quot;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;短链接原理&quot;&gt;&lt;a c</summary>
      
    
    
    
    <category term="projects" scheme="https://nn.ci/categories/projects/"/>
    
    
    <category term="go" scheme="https://nn.ci/tags/go/"/>
    
  </entry>
  
  <entry>
    <title>C++ 多线程使用</title>
    <link href="https://nn.ci/posts/cpp-multithreading.html"/>
    <id>https://nn.ci/posts/cpp-multithreading.html</id>
    <published>2020-10-01T06:08:00.000Z</published>
    <updated>2020-10-01T06:08:00.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="c-多线程使用"><a class="markdownIt-Anchor" href="#c-多线程使用"></a> C++ 多线程使用</h3><p>最近在做C++的开发，其中很多地方需要使用到多线程，故记录在此。</p><p>头文件：<code>#include &lt;thread&gt;</code>，命名空间：<code>std</code></p><p><code>std::thread</code>是C++11之后的标准线程库，使用起来很方便。</p><p>主要有以下几种使用方式：</p><h5 id="新线程执行一个函数"><a class="markdownIt-Anchor" href="#新线程执行一个函数"></a> 新线程执行一个函数</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;thread&gt;</span></span></span><br><span class="line"> </span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">t1</span><span class="params">()</span> </span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="number">10</span>; ++i)</span><br><span class="line">    &#123;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;thread-1\n&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">t2</span><span class="params">(<span class="type">int</span> n)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; ++i)</span><br><span class="line">    &#123;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;thread-2\n&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="function">thread <span class="title">th1</span><span class="params">(t1)</span></span>;  <span class="comment">//没有参数时</span></span><br><span class="line">    <span class="function">thread <span class="title">th2</span><span class="params">(t2,<span class="number">10</span>)</span></span>; <span class="comment">//有参数时</span></span><br><span class="line"> </span><br><span class="line">    th1.<span class="built_in">join</span>(); <span class="comment">// 必须将线程join或者detach 等待子线程结束主进程才可以退出，detach是用来和线程对象分离的，这样线程会独立地执行</span></span><br><span class="line">    th2.<span class="built_in">join</span>(); </span><br><span class="line"> </span><br><span class="line">    <span class="comment">//or use detach</span></span><br><span class="line">    <span class="comment">//th1.detach();</span></span><br><span class="line">    <span class="comment">//th2.detach();</span></span><br><span class="line"> </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;main thread\n&quot;</span>;</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h5 id="类外新线程执行一个成员函数"><a class="markdownIt-Anchor" href="#类外新线程执行一个成员函数"></a> 类外新线程执行一个成员函数</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;thread&gt;</span></span></span><br><span class="line"> </span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Client</span>&#123;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">recieve</span><span class="params">()</span></span>;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">recieve</span><span class="params">(<span class="type">int</span> conn)</span></span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> Client *client=<span class="keyword">new</span> <span class="built_in">Client</span>();<span class="comment">//此处必须使用指针</span></span><br><span class="line">    <span class="function">thread <span class="title">t1</span><span class="params">(&amp;Client::recieve,client)</span></span>;<span class="comment">//没有参数时</span></span><br><span class="line">    <span class="function">thread <span class="title">t2</span><span class="params">(&amp;Client::recieve,client,<span class="number">1</span>)</span></span>;<span class="comment">//有参数时</span></span><br><span class="line">    t1.<span class="built_in">join</span>();</span><br><span class="line">    t2.<span class="built_in">join</span>();</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h5 id="类中新线程执行成员函数"><a class="markdownIt-Anchor" href="#类中新线程执行成员函数"></a> 类中新线程执行成员函数</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;thread&gt;</span></span></span><br><span class="line"> </span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Client</span>&#123;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">recieve</span><span class="params">()</span></span>;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">recieve</span><span class="params">(<span class="type">int</span> conn)</span></span>;</span><br><span class="line">    </span><br><span class="line">    <span class="built_in">Client</span>()&#123;</span><br><span class="line">        <span class="function">thread <span class="title">t1</span><span class="params">(&amp;Client::recieve,<span class="keyword">this</span>)</span></span>;<span class="comment">//没有参数时</span></span><br><span class="line">    <span class="function">thread <span class="title">t2</span><span class="params">(&amp;Client::recieve,<span class="keyword">this</span>,<span class="number">1</span>)</span></span>;<span class="comment">//有参数时</span></span><br><span class="line">        t1.<span class="built_in">detach</span>();</span><br><span class="line">        t2.<span class="built_in">detach</span>();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">while</span>(<span class="literal">true</span>)&#123;</span><br><span class="line">        </span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;c-多线程使用&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#c-多线程使用&quot;&gt;&lt;/a&gt; C++ 多线程使用&lt;/h3&gt;
&lt;p&gt;最近在做C++的开发，其中很多地方需要使用到多线程，故记录在此。&lt;/p&gt;
&lt;p&gt;头文件：&lt;code&gt;#incl</summary>
      
    
    
    
    <category term="tutorials" scheme="https://nn.ci/categories/tutorials/"/>
    
    
    <category term="C++" scheme="https://nn.ci/tags/C/"/>
    
    <category term="multithreading" scheme="https://nn.ci/tags/multithreading/"/>
    
  </entry>
  
  <entry>
    <title>ubuntu安装配置Jenkins与SonarQube</title>
    <link href="https://nn.ci/posts/jenkins-sonarqube.html"/>
    <id>https://nn.ci/posts/jenkins-sonarqube.html</id>
    <published>2020-09-13T09:20:18.000Z</published>
    <updated>2020-09-13T09:20:18.000Z</updated>
    
    <content type="html"><![CDATA[<p>Jenkins是一款开源 <code>CI&amp;CD</code> 软件，用于自动化各种任务，包括构建、测试和部署软件。</p><p>Jenkins 支持各种运行方式，可通过系统包、Docker 或者通过一个独立的 Java 程序。</p><h3 id="jenkins安装部署所需条件及作用"><a class="markdownIt-Anchor" href="#jenkins安装部署所需条件及作用"></a> Jenkins安装部署所需条件及作用</h3><h4 id="jenkins安装部署所需条件"><a class="markdownIt-Anchor" href="#jenkins安装部署所需条件"></a> Jenkins安装部署所需条件</h4><h5 id="机器要求"><a class="markdownIt-Anchor" href="#机器要求"></a> 机器要求</h5><ul><li>最少256 MB 的内存，建议大于 512 MB</li><li>10 GB 的硬盘空间（用于 Jenkins 和 Docker 镜像）</li></ul><h5 id="环境要求"><a class="markdownIt-Anchor" href="#环境要求"></a> 环境要求</h5><ul><li>Java 8 ( JRE 或者 JDK 都可以)</li><li><a class="link"   href="https://www.docker.com/" >Docker<i class="fas fa-external-link-alt"></i></a> （如果需要使用<code>docker</code>来部署）</li><li>Maven  （如果需要使用Maven构建项目）</li><li>Tomcat （如果基于Tomcat安装）</li></ul><h4 id="jenkins的作用"><a class="markdownIt-Anchor" href="#jenkins的作用"></a> Jenkins的作用</h4><p>Jenkins的主要作用是用来做<code>CI&amp;CD</code>，在软件工程中，CI / CD或CICD通常是指持续集成以及持续交付或持续部署的组合实践(from <a class="link"   href="https://en.wikipedia.org/wiki/CI/CD" >wiki<i class="fas fa-external-link-alt"></i></a>)。具体而言，CI/CD 可让持续自动化和持续监控贯穿于应用的整个生命周期（从集成和测试阶段，到交付和部署）。这些关联的事务通常被统称为“CI/CD 管道”，由开发和运维团队以敏捷方式协同支持。</p><p>所以在此处，Jenkins的主要作用是，我们将代码提交到SVN，Jenkins自动从SVN获取最新的代码，然后进行一系列自动的打包、测试、部署的工作，不需要我们手动去完成。</p><h3 id="jenkins安装部署"><a class="markdownIt-Anchor" href="#jenkins安装部署"></a> Jenkins安装部署</h3><h4 id="首先是jdk的安装"><a class="markdownIt-Anchor" href="#首先是jdk的安装"></a> 首先是<a class="link"   href="https://blog.xhofe.top/2020/04/19/linux-install-java/" >JDK的安装<i class="fas fa-external-link-alt"></i></a> ：</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /mnt/java</span><br><span class="line">wget xxx.com/jdk-8u251-linux-x64.tar.gz</span><br><span class="line">tar -zxvf jdk-8u251-linux-x64.tar.gz</span><br></pre></td></tr></table></figure><p>因为环境变量中已经配置了Jdk1.7，所以不再配置环境变量。</p><h4 id="然后是安装maven"><a class="markdownIt-Anchor" href="#然后是安装maven"></a> 然后是<a class="link"   href="https://blog.xhofe.top/2020/04/19/linux-install-java/#Maven%E5%AE%89%E8%A3%85" >安装Maven <i class="fas fa-external-link-alt"></i></a>;</h4><h5 id="安装maven"><a class="markdownIt-Anchor" href="#安装maven"></a> 安装maven</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> /mnt/maven</span><br><span class="line"><span class="built_in">cd</span> /mnt/maven</span><br><span class="line">wget xxx.com/apache-maven-3.6.3-bin.tar.gz</span><br><span class="line">tar -zxvf apache-maven-3.6.3-bin.tar.gz</span><br><span class="line">vim /etc/profile</span><br><span class="line"><span class="comment"># 添加</span></span><br><span class="line"><span class="built_in">export</span> M2_HOME=/mnt/maven/apache-maven-3.6.3</span><br><span class="line"><span class="built_in">export</span> PATH=<span class="variable">$&#123;M2_HOME&#125;</span>/bin:<span class="variable">$PATH</span></span><br><span class="line"><span class="comment">#使环境变量生效</span></span><br><span class="line"><span class="built_in">source</span> /etc/profile</span><br></pre></td></tr></table></figure><h5 id="更改默认的仓库位置与maven阿里云镜像"><a class="markdownIt-Anchor" href="#更改默认的仓库位置与maven阿里云镜像"></a> 更改默认的仓库位置与maven阿里云镜像：</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 新建仓库文件夹</span></span><br><span class="line"><span class="built_in">mkdir</span> /mnt/maven/repository</span><br><span class="line"><span class="comment"># 备份默认的配置文件</span></span><br><span class="line"><span class="built_in">cd</span> /mnt/maven/apache-maven-3.6.3/conf</span><br><span class="line"><span class="built_in">cp</span> settings.xml settings-backup.xml</span><br><span class="line">vim settings.xml</span><br><span class="line"><span class="comment"># 在settings标签中添加</span></span><br><span class="line">&lt;localRepository&gt;/mnt/maven/repository&lt;/localRepository&gt;</span><br><span class="line"><span class="comment"># 添加mirrors子节点</span></span><br><span class="line">&lt;mirror&gt;</span><br><span class="line">  &lt;<span class="built_in">id</span>&gt;aliyunmaven&lt;/id&gt;</span><br><span class="line">  &lt;mirrorOf&gt;*&lt;/mirrorOf&gt;</span><br><span class="line">  &lt;name&gt;阿里云公共仓库&lt;/name&gt;</span><br><span class="line">  &lt;url&gt;https://maven.aliyun.com/repository/public&lt;/url&gt;</span><br><span class="line">&lt;/mirror&gt;</span><br></pre></td></tr></table></figure><h4 id="安装jenkins"><a class="markdownIt-Anchor" href="#安装jenkins"></a> 安装Jenkins</h4><p>此处采用war包方式安装：</p><ul><li><p>首先设置Jenkins_home</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 创建文件夹</span></span><br><span class="line"><span class="built_in">mkdir</span> /mnt/jenkins</span><br><span class="line"><span class="built_in">mkdir</span> /mnt/jenkins/jenkins-home</span><br><span class="line">vim /etc/profile</span><br><span class="line"><span class="comment"># 添加</span></span><br><span class="line"><span class="built_in">export</span> JENKINS_HOME=/mnt/jenkins/jenkins-home</span><br><span class="line"><span class="comment">#使环境变量生效</span></span><br><span class="line"><span class="built_in">source</span> /etc/profile</span><br></pre></td></tr></table></figure></li><li><p>拉取免安装war包(建议先在本地下载，然后在传上去)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /mnt/jenkins</span><br><span class="line">wget http://mirrors.jenkins.io/war-stable/2.249.1/jenkins.war</span><br></pre></td></tr></table></figure></li><li><p>添加Jenkins运行脚本</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /mnt/jenkins</span><br><span class="line"><span class="comment"># 新建日志存放目录</span></span><br><span class="line"><span class="built_in">mkdir</span> jenkins-logs</span><br><span class="line">vim run.sh</span><br><span class="line"><span class="comment"># 添加</span></span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line">pid=`ps -ef | grep jenkins.war | grep -v <span class="string">&#x27;grep&#x27;</span>| awk <span class="string">&#x27;&#123;print $2&#125;&#x27;</span>| <span class="built_in">wc</span> -l`</span><br><span class="line"><span class="keyword">if</span> [ <span class="string">&quot;<span class="variable">$1</span>&quot;</span> = <span class="string">&quot;start&quot;</span> ];<span class="keyword">then</span></span><br><span class="line">        <span class="keyword">if</span> [ <span class="variable">$pid</span> -gt 0 ];<span class="keyword">then</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&#x27;jenkins is running...&#x27;</span></span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    /mnt/java/jdk1.8.0_251/bin/java -jar jenkins.war --httpPort=8080 &gt;jenkins-logs/log1.<span class="built_in">log</span> 2&gt;&amp;1 &amp;</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&#x27;jenkins is starting&#x27;</span></span><br><span class="line">        <span class="keyword">fi</span></span><br><span class="line"><span class="keyword">elif</span> [ <span class="string">&quot;<span class="variable">$1</span>&quot;</span> = <span class="string">&quot;stop&quot;</span> ];<span class="keyword">then</span></span><br><span class="line">        <span class="built_in">exec</span> ps -ef | grep jenkins | grep -v grep | awk <span class="string">&#x27;&#123;print $2&#125;&#x27;</span>| xargs <span class="built_in">kill</span> -9</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&#x27;jenkins is stop..&#x27;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">        <span class="built_in">echo</span> <span class="string">&quot;Please input like this:&quot;</span>./run.sh start<span class="string">&quot; or &quot;</span>./jenkins stop<span class="string">&quot;&quot;</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="comment"># 赋予脚本执行权限</span></span><br><span class="line"><span class="built_in">chmod</span> +x run.sh</span><br></pre></td></tr></table></figure></li><li><p>运行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bash run.sh start</span><br></pre></td></tr></table></figure></li></ul><h4 id="jenkins的配置"><a class="markdownIt-Anchor" href="#jenkins的配置"></a> Jenkins的配置</h4><h5 id="系统配置"><a class="markdownIt-Anchor" href="#系统配置"></a> 系统配置</h5><ul><li><p>打开域名/ip:8080</p></li><li><p>获取初始密码，在<code>/mnt/jenkins/jenkins-logs/log1.log</code>日志文件中寻找，或者</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> /mnt/jenkins/jenkins-home/secrets/initialAdminPassword</span><br></pre></td></tr></table></figure></li><li><p>输入初始密码，继续</p></li><li><p>安装推荐的插件/选择插件安装，都不选，直接叉掉跳过，然后在用户名-configure-修改密码</p></li><li><p>汉化：<code>System configuration</code>–<code>plugin manage</code>–<code>available plugin</code>–<code>search cn</code>–选择Chinese simplified安装，然后重启Jenkins</p></li><li><p>设置jdk和maven</p><ul><li>jdk：系统管理-全局工具配置-新增JDK-别名：JDK1.8；JAVA_HOME：/mnt/java/jdk1.8.0_251</li><li>maven：系统管理-全局工具配置-新增Maven-别名：MAVEN3.6.3；MAVEN_HOME：/mnt/maven/apache-maven-3.6.3</li></ul></li><li><p>安装需要的插件：（勾选直接安装，视情况选择）</p><ul><li>git</li><li><a class="link"   href="https://plugins.jenkins.io/subversion" >Subversion<i class="fas fa-external-link-alt"></i></a></li><li><a class="link"   href="https://plugins.jenkins.io/maven-plugin" >Maven Integration<i class="fas fa-external-link-alt"></i></a></li></ul></li></ul><h5 id="新建job此处以cloudweb为例"><a class="markdownIt-Anchor" href="#新建job此处以cloudweb为例"></a> 新建Job（此处以cloudweb为例）</h5><ul><li><p>新建任务</p></li><li><p>选择构建一个maven项目</p></li><li><p>勾选丢弃旧的构建，保持构建的天数与保持构建的最大个数都填10</p></li><li><p>源码管理选择git或者Subversion，填入URL</p></li><li><p>Credentials-添加-Jenkins-username with password</p></li><li><p>构建触发器-去掉<code>Build whenever a SNAPSHOT dependency is built</code>勾选</p></li><li><p><code>build：root</code> <code>pom：pom.xml</code>    <code>Goals and options：package -Dmaven.test.skip=true</code></p></li><li><p>保存-立即构建</p></li></ul><h3 id="sonarqube"><a class="markdownIt-Anchor" href="#sonarqube"></a> Sonarqube</h3><p><a class="link"   href="https://www.sonarqube.org/" >SonarQube<i class="fas fa-external-link-alt"></i></a> 是一个开源的代码分析平台，用来持续分析和评测代码的质量，支持检测 Java、JavaScript、C#、C、C++ 等二十几种编程语言。通过 SonarQube 可以检测出项目中潜在的Bug、漏洞、代码规范、重复代码、缺乏单元测试的代码等问题，并提供了 UI 界面进行查看和管理。</p><h4 id="sonarqube安装"><a class="markdownIt-Anchor" href="#sonarqube安装"></a> sonarqube安装</h4><h5 id="确定要使用的sonarqube版本"><a class="markdownIt-Anchor" href="#确定要使用的sonarqube版本"></a> 确定要使用的sonarqube版本</h5><p>当前sonarqube最新版本为8.4，但是需要jdk版本至少为11，且不支持mysql5.7，最近的长期支持版本SonarQube 7.9.4 LTS也是。</p><p>所以我选择的是sonarqube 7.7，支持jdk8和MySQL 5.7.</p><h5 id="首先下载sonarqube建议手动下载上传"><a class="markdownIt-Anchor" href="#首先下载sonarqube建议手动下载上传"></a> 首先下载sonarqube（建议手动下载上传）</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> /mnt/jenkins/sonarqube</span><br><span class="line"><span class="built_in">cd</span> /mnt/jenkins/sonarqube</span><br><span class="line">wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.7.zip</span><br></pre></td></tr></table></figure><h5 id="安装sonarqube"><a class="markdownIt-Anchor" href="#安装sonarqube"></a> 安装sonarqube</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 直接解压即可</span></span><br><span class="line">unzip sonarqube-7.7.zip</span><br></pre></td></tr></table></figure><h5 id="配置sonarqube"><a class="markdownIt-Anchor" href="#配置sonarqube"></a> 配置sonarqube</h5><ul><li><p>首先区mysql中新建一个数据库，名称为<code>sonar</code></p></li><li><p>配置<code>sonar.properties</code>中的数据库(这里很坑，地址填localhost无法连接，找了很久)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">vim /mnt/jenkins/sonarqube/sonarqube-7.7/conf/sonar.properties</span><br><span class="line"><span class="comment"># 添加</span></span><br><span class="line">sonar.jdbc.url=jdbc:mysql://xhofe.top:3306/sonar?useUnicode=<span class="literal">true</span>&amp;characterEncoding=utf8&amp;rewriteBatchedStatements=<span class="literal">true</span>&amp;useConfigs=maxPerformance&amp;useSSL=<span class="literal">false</span>&amp;serverTimezone=Asia/Shanghai</span><br><span class="line">sonar.jdbc.username=<span class="built_in">test</span></span><br><span class="line">sonar.jdbc.password=<span class="built_in">test</span></span><br></pre></td></tr></table></figure></li></ul><h5 id="启动sonarqube"><a class="markdownIt-Anchor" href="#启动sonarqube"></a> 启动Sonarqube</h5><ul><li><p>因为环境变量中的Java版本是1.7，而sonarqube需要的jdk是8，所以需要手动修改一下启动文件：</p>  <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">vim /mnt/jenkins/sonarqube/sonarqube-7.7/conf/wrapper.conf</span><br><span class="line"><span class="comment"># 修改 wrapper.java.command</span></span><br><span class="line">wrapper.java.command=/mnt/java/jdk1.8.0_251/bin/java</span><br></pre></td></tr></table></figure></li><li><p>sonarqube不能以root用户运行，所以需要创建新用户</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">useradd sonar</span><br><span class="line">passwd sonar</span><br><span class="line">Enter new UNIX password: sonar</span><br><span class="line">Retype new UNIX password: sonar</span><br><span class="line"><span class="built_in">chown</span> -R sonar:sonar /mnt/jenkins/sonarqube/sonarqube-7.7</span><br></pre></td></tr></table></figure></li><li><p>修改vm.max_map_count 与max file descriptors</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /etc/sysctl.conf</span><br><span class="line"><span class="comment"># 添加</span></span><br><span class="line">vm.max_map_count=655360</span><br><span class="line"><span class="comment"># 执行</span></span><br><span class="line">sudo sysctl -p</span><br><span class="line">vim /etc/security/limits.conf</span><br><span class="line"><span class="comment"># 添加</span></span><br><span class="line">sonar soft nofile 65536</span><br><span class="line">sonar hard nofile 65536</span><br></pre></td></tr></table></figure></li><li><p>启动</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">  su sonar</span><br><span class="line">  <span class="built_in">cd</span> /mnt/jenkins/sonarqube/sonarqube-7.7/bin/linux-x86-64</span><br><span class="line">./sonar.sh start</span><br></pre></td></tr></table></figure></li><li><p>汉化(或者手动上传)</p><p>打开<code>http://[url/ip]:9000/</code>默认密码为admin/admin；</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /mnt/jenkins/sonarqube/sonarqube-7.7/extensions/plugins</span><br><span class="line">wget https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases/download/sonar-l10n-zh-plugin-1.27/sonar-l10n-zh-plugin-1.27.jar</span><br><span class="line"><span class="built_in">cd</span> /mnt/jenkins/sonarqube/sonarqube-7.7/bin/linux-x86-64</span><br><span class="line">./sonar.sh restart</span><br></pre></td></tr></table></figure></li></ul><h4 id="与jenkins集成"><a class="markdownIt-Anchor" href="#与jenkins集成"></a> 与Jenkins集成</h4><h5 id="jenkins安装sonarqube-scanner"><a class="markdownIt-Anchor" href="#jenkins安装sonarqube-scanner"></a> Jenkins安装<a class="link"   href="https://plugins.jenkins.io/sonar" >SonarQube Scanner<i class="fas fa-external-link-alt"></i></a></h5><ul><li><p>Jenkins-系统管理-插件管理-可用插件-<a class="link"   href="https://plugins.jenkins.io/sonar" >SonarQube Scanner<i class="fas fa-external-link-alt"></i></a>-直接安装</p></li><li><p>重启Jenkins</p></li></ul><h5 id="配置jenkins与sonarqube集成"><a class="markdownIt-Anchor" href="#配置jenkins与sonarqube集成"></a> 配置Jenkins与sonarqube集成</h5><ul><li><p>首先，在SonarQube中生成一个Token：我的账号-安全-生成令牌-名称填Jenkins（token）</p></li><li><p>然后，在Jenkins中配置连接sonarqube服务器的地址，这里用到的token就是刚才在sonarqube中创建的那个token：Jenkins-系统管理-系统配置-SonarQube servers-add sonarqube：</p></li></ul><table><thead><tr><th>Name</th><th>sonarqube</th></tr></thead><tbody><tr><td>Server URL</td><td>http://[url/ip]:9000</td></tr><tr><td>Server authentication token</td><td>添加-secret text-id/描述:sonarqube,secret:刚刚生成的token</td></tr></tbody></table><p>保存应用</p><ul><li><p>最后，配置全局工具配置：Jenkins-系统管理-全局工具配置-SonarQube Scanner-新增SonarQube Scanner-</p><p>名称：sonarqube scanner，勾选自动安装，版本选择<code>4.0.0.1744</code></p><p>保存应用。</p></li></ul><h5 id="sonarqube中配置svn选做如果使用git则不需要"><a class="markdownIt-Anchor" href="#sonarqube中配置svn选做如果使用git则不需要"></a> sonarqube中配置svn(选做，如果使用git则不需要)</h5><p>sonar-runner发现了.svn文件，于是启动了自己的SVN插件，去访问SVN，所以需要配置svn，配置-scm-将Disabled the SCM Sensor设置为true，在svn页面，设置svn的用户名和密码。</p><h5 id="如何使用"><a class="markdownIt-Anchor" href="#如何使用"></a> 如何使用</h5><p>在Jenkins中创建job时，post-steps中添加excute sonarqube scanner；</p><p>Analysis properties：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">sonar.projectKey=cloudweb</span><br><span class="line">sonar.projectName=cloudweb</span><br><span class="line">sonar.projectVersion=1.0</span><br><span class="line"></span><br><span class="line">sonar.language=java</span><br><span class="line">sonar.sourceEncoding=UTF-8</span><br><span class="line"></span><br><span class="line">sonar.sources=<span class="variable">$WORKSPACE</span>/src</span><br><span class="line">sonar.java.binaries=<span class="variable">$WORKSPACE</span>/target/classes</span><br></pre></td></tr></table></figure><p>保存应用。</p><p>OK~现在就点击立即构建吧。</p><h4 id="参考"><a class="markdownIt-Anchor" href="#参考"></a> 参考</h4><ul><li><p><a class="link"   href="https://blog.csdn.net/shuizhihun07/article/details/80168076" >Jenkins使用教程<i class="fas fa-external-link-alt"></i></a></p></li><li><p><a class="link"   href="https://www.cnblogs.com/cjsblog/p/10740840.html" >Jenkins 集成 SonarQube Scanner<i class="fas fa-external-link-alt"></i></a></p></li><li><p><a class="link"   href="https://ken.io/note/jenkins-maven-java-sonar-integration" >Jenkins集成SonarQube进行代码质量扫描<i class="fas fa-external-link-alt"></i></a></p></li><li><p><a class="link"   href="https://docs.sonarqube.org/7.7/" >sonarqube<i class="fas fa-external-link-alt"></i></a></p></li><li><p><a class="link"   href="https://www.cnblogs.com/YatHo/p/7345077.html" >sonar-scanner扫描代码出错 SonarQube svn: E170001<i class="fas fa-external-link-alt"></i></a></p></li><li><p><a class="link"   href="https://blog.csdn.net/lilongsy/article/details/78708027" >max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]<i class="fas fa-external-link-alt"></i></a></p></li><li><p><a class="link"   href="https://blog.csdn.net/jiahao1186/article/details/90235771" >解决：max file descriptors [65535] for elasticsearch process is too low<i class="fas fa-external-link-alt"></i></a></p></li><li><p><a class="link"   href="https://blog.csdn.net/zdyueguanyun/article/details/79447260" >sonar es can not run elasticsearch as root<i class="fas fa-external-link-alt"></i></a></p></li><li><p><a class="link"   href="https://www.linuxidc.com/Linux/2018-01/150148.htm" >Linux下为Sonarqube安装中文插件<i class="fas fa-external-link-alt"></i></a></p></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Jenkins是一款开源 &lt;code&gt;CI&amp;amp;CD&lt;/code&gt; 软件，用于自动化各种任务，包括构建、测试和部署软件。&lt;/p&gt;
&lt;p&gt;Jenkins 支持各种运行方式，可通过系统包、Docker 或者通过一个独立的 Java 程序。&lt;/p&gt;
&lt;h3 id=&quot;jenki</summary>
      
    
    
    
    <category term="tutorials" scheme="https://nn.ci/categories/tutorials/"/>
    
    
    <category term="CI/CD" scheme="https://nn.ci/tags/CI-CD/"/>
    
    <category term="linux" scheme="https://nn.ci/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>移除类dp问题</title>
    <link href="https://nn.ci/posts/remove-dp.html"/>
    <id>https://nn.ci/posts/remove-dp.html</id>
    <published>2020-07-01T09:20:18.000Z</published>
    <updated>2020-07-30T09:20:18.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="移除类dp问题"><a class="markdownIt-Anchor" href="#移除类dp问题"></a> 移除类<code>dp</code>问题</h3><p>移除类<code>dp</code>问题和平常的<code>dp</code>问题不一样，因为平常的<code>dp</code>问题都是每次做出选择直接分解成子问题，但是移除类<code>dp</code>问题每次的选择会改变问题的状态，所以我们需要逆向思考，给状态的定义是每次最后的选择。</p><h3 id="题目收集"><a class="markdownIt-Anchor" href="#题目收集"></a> 题目收集：</h3><h4 id="312-戳气球"><a class="markdownIt-Anchor" href="#312-戳气球"></a> <a class="link"   href="https://leetcode-cn.com/problems/burst-balloons/" >312. 戳气球<i class="fas fa-external-link-alt"></i></a></h4><p>有 <code>n</code> 个气球，编号为<code>0</code> 到 <code>n-1</code>，每个气球上都标有一个数字，这些数字存在数组 <code>nums</code> 中。</p><p>现在要求你戳破所有的气球。如果你戳破气球 <code>i</code> ，就可以获得 <code>nums[left] * nums[i] * nums[right]</code> 个硬币。 这里的 <code>left</code> 和 <code>right</code> 代表和 <code>i</code> 相邻的两个气球的序号。注意当你戳破了气球 <code>i</code> 后，气球 <code>left</code> 和气球 <code>right</code> 就变成了相邻的气球。</p><p>求所能获得硬币的最大数量。</p><p><strong>说明:</strong></p><ul><li>你可以假设 <code>nums[-1] = nums[n] = 1</code>，但注意它们不是真实存在的所以并不能被戳破。</li><li>0 ≤ <code>n</code> ≤ 500, 0 ≤ <code>nums[i]</code> ≤ 100</li></ul><p><strong>示例:</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">输入: [3,1,5,8]</span><br><span class="line">输出: 167 </span><br><span class="line">解释: nums = [3,1,5,8] --&gt; [3,5,8] --&gt;   [3,8]   --&gt;  [8]  --&gt; []</span><br><span class="line">     coins =  3*1*5      +  3*5*8    +  1*3*8      + 1*8*1   = 167</span><br></pre></td></tr></table></figure><h5 id="code"><a class="markdownIt-Anchor" href="#code"></a> code</h5><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">maxCoins</span><span class="params">(<span class="type">int</span>[] nums)</span> &#123;</span><br><span class="line">        <span class="type">int</span> len=nums.length;</span><br><span class="line">        <span class="keyword">if</span> (len==<span class="number">0</span>)<span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        <span class="type">int</span>[][] dp=<span class="keyword">new</span> <span class="title class_">int</span>[len][len];</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; len; i++) &#123;</span><br><span class="line">            dp[i][i]=nums[i]*(i&gt;<span class="number">0</span>?nums[i-<span class="number">1</span>]:<span class="number">1</span>)*(i+<span class="number">1</span>&lt;len?nums[i+<span class="number">1</span>]:<span class="number">1</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">1</span>; i &lt; len; i++) &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">0</span>; j &lt; len-i; j++) &#123;</span><br><span class="line">                <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">k</span> <span class="operator">=</span> j; k &lt;= j+i; k++) &#123;</span><br><span class="line">                    dp[j][j+i]=Math.max(dp[j][j+i],nums[k]*(j&gt;<span class="number">0</span>?nums[j-<span class="number">1</span>]:<span class="number">1</span>)*(j+i+<span class="number">1</span>&lt;len?nums[j+i+<span class="number">1</span>]:<span class="number">1</span>)+(j&gt;k-<span class="number">1</span>?<span class="number">0</span>:dp[j][k-<span class="number">1</span>])+(k+<span class="number">1</span>&gt;j+i?<span class="number">0</span>:dp[k+<span class="number">1</span>][j+i]));</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> dp[<span class="number">0</span>][len-<span class="number">1</span>];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="546-移除盒子"><a class="markdownIt-Anchor" href="#546-移除盒子"></a> <a class="link"   href="https://leetcode-cn.com/problems/remove-boxes/" >546. 移除盒子<i class="fas fa-external-link-alt"></i></a></h4><p>给出一些不同颜色的盒子，盒子的颜色由数字表示，即不同的数字表示不同的颜色。<br />你将经过若干轮操作去去掉盒子，直到所有的盒子都去掉为止。每一轮你可以移除具有相同颜色的连续 k 个盒子（k &gt;= 1），这样一轮之后你将得到 <code>k*k</code> 个积分。<br />当你将所有盒子都去掉之后，求你能获得的最大积分和。</p><p><strong>示例：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">输入：boxes = [1,3,2,2,2,3,4,3,1]</span><br><span class="line">输出：23</span><br><span class="line">解释：</span><br><span class="line">[1, 3, 2, 2, 2, 3, 4, 3, 1] </span><br><span class="line">----&gt; [1, 3, 3, 4, 3, 1] (3*3=9 分) </span><br><span class="line">----&gt; [1, 3, 3, 3, 1] (1*1=1 分) </span><br><span class="line">----&gt; [1, 1] (3*3=9 分) </span><br><span class="line">----&gt; [] (2*2=4 分)</span><br></pre></td></tr></table></figure><p><strong>提示：</strong></p><ul><li><code>1 &lt;= boxes.length &lt;= 100</code></li><li><code>1 &lt;= boxes[i] &lt;= 100</code></li></ul><h5 id="code-2"><a class="markdownIt-Anchor" href="#code-2"></a> code</h5><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line">    <span class="type">int</span> dp[<span class="number">100</span>][<span class="number">100</span>][<span class="number">100</span>];</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">    <span class="function"><span class="type">int</span> <span class="title">removeBoxes</span><span class="params">(vector&lt;<span class="type">int</span>&gt;&amp; boxes)</span> </span>&#123;</span><br><span class="line">        <span class="built_in">memset</span>(dp,<span class="number">0</span>,<span class="built_in">sizeof</span>(dp));</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">calculatePoints</span>(boxes,<span class="number">0</span>,boxes.<span class="built_in">size</span>()<span class="number">-1</span>,<span class="number">0</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">int</span> <span class="title">calculatePoints</span><span class="params">(vector&lt;<span class="type">int</span>&gt;&amp; boxes,<span class="type">int</span> l,<span class="type">int</span> r,<span class="type">int</span> k)</span></span>&#123;</span><br><span class="line">        <span class="keyword">if</span>(l&gt;r)<span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">if</span>(dp[l][r][k]!=<span class="number">0</span>)<span class="keyword">return</span> dp[l][r][k];</span><br><span class="line">        <span class="keyword">while</span>(r&gt;l&amp;&amp;boxes[r<span class="number">-1</span>]==boxes[r])&#123;</span><br><span class="line">            r--;k++;</span><br><span class="line">        &#125;</span><br><span class="line">        dp[l][r][k]=<span class="built_in">calculatePoints</span>(boxes,l,r<span class="number">-1</span>,<span class="number">0</span>)+(k+<span class="number">1</span>)*(k+<span class="number">1</span>);</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> i=l;i&lt;r;++i)&#123;</span><br><span class="line">            <span class="keyword">if</span>(boxes[i]==boxes[r])&#123;</span><br><span class="line">                dp[l][r][k]=<span class="built_in">max</span>(dp[l][r][k],<span class="built_in">calculatePoints</span>(boxes,l,i,k+<span class="number">1</span>)+<span class="built_in">calculatePoints</span>(boxes,i+<span class="number">1</span>,r<span class="number">-1</span>,<span class="number">0</span>));</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> dp[l][r][k];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;移除类dp问题&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#移除类dp问题&quot;&gt;&lt;/a&gt; 移除类&lt;code&gt;dp&lt;/code&gt;问题&lt;/h3&gt;
&lt;p&gt;移除类&lt;code&gt;dp&lt;/code&gt;问题和平常的&lt;code&gt;dp&lt;/code&gt;问题不一样</summary>
      
    
    
    
    <category term="algorithm" scheme="https://nn.ci/categories/algorithm/"/>
    
    
    <category term="leetcode" scheme="https://nn.ci/tags/leetcode/"/>
    
    <category term="dp" scheme="https://nn.ci/tags/dp/"/>
    
  </entry>
  
  <entry>
    <title>Leetcode 2020-05月份每日一题</title>
    <link href="https://nn.ci/posts/20-05-leetcode.html"/>
    <id>https://nn.ci/posts/20-05-leetcode.html</id>
    <published>2020-05-01T09:20:18.000Z</published>
    <updated>2020-05-30T09:20:18.000Z</updated>
    
    <content type="html"><![CDATA[<p><img                       lazyload                     src="/images/loading.svg"                     data-src="20-05-leetcode/33ba6a65efb27.png"                      alt="Ya7b0e.png"                 ></p><h4 id="17-210-课程表-ii"><a class="markdownIt-Anchor" href="#17-210-课程表-ii"></a> 17 <a class="link"   href="https://leetcode-cn.com/problems/course-schedule-ii/" >210. 课程表 II<i class="fas fa-external-link-alt"></i></a></h4><h5 id="题目"><a class="markdownIt-Anchor" href="#题目"></a> 题目</h5><p>现在你总共有 n 门课需要选，记为 0 到 n-1。</p><p>在选修某些课程之前需要一些先修课程。 例如，想要学习课程 0 ，你需要先完成课程 1 ，我们用一个匹配来表示他们: [0,1]</p><p>给定课程总量以及它们的先决条件，返回你为了学完所有课程所安排的学习顺序。</p><p>可能会有多个正确的顺序，你只要返回一种就可以了。如果不可能完成所有课程，返回一个空数组。</p><p>示例 1:</p><blockquote><p><strong>输入</strong>: 2, [[1,0]]<br /><strong>输出</strong>: [0,1]<br />解释: 总共有 2 门课程。要学习课程 1，你需要先完成课程 0。因此，正确的课程顺序为 [0,1] 。</p></blockquote><p>示例 2:</p><blockquote><p><strong>输入</strong>: 4, [[1,0],[2,0],[3,1],[3,2]]<br /><strong>输出</strong>: [0,1,2,3] or [0,2,1,3]<br />解释: 总共有 4 门课程。要学习课程 3，你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。<br />因此，一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3] 。</p></blockquote><p>说明:</p><ul><li>输入的先决条件是由边缘列表表示的图形，而不是邻接矩阵。详情请参见图的表示法。</li><li>你可以假定输入的先决条件中没有重复的边。</li></ul><p>提示:</p><ul><li>这个问题相当于查找一个循环是否存在于有向图中。如果存在循环，则不存在拓扑排序，因此不可能选取所有课程进行学习。</li><li>通过 DFS 进行拓扑排序 - 一个关于Coursera的精彩视频教程（21分钟），介绍拓扑排序的基本概念。</li><li>拓扑排序也可以通过 BFS 完成。</li></ul><h5 id="思路"><a class="markdownIt-Anchor" href="#思路"></a> 思路</h5><p>拓扑排序过程：</p><p>(1) 选择一个入度为0的顶点并输出之；</p><p>(2) 从网中删除此顶点及所有出边。</p><p>重复执行此过程，若无剩余点则删除的顺序即为一个答案，若有则无解。</p><p>ps：将给的参数转换成图会更快一些，懒得写了。</p><h5 id="code"><a class="markdownIt-Anchor" href="#code"></a> code</h5><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span>[] findOrder(<span class="type">int</span> numCourses, <span class="type">int</span>[][] prerequisites) &#123;</span><br><span class="line">        <span class="type">int</span>[] indegree=<span class="keyword">new</span> <span class="title class_">int</span>[numCourses];</span><br><span class="line">        <span class="type">int</span>[] res=<span class="keyword">new</span> <span class="title class_">int</span>[numCourses];</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span>[] prerequisite : prerequisites) &#123;</span><br><span class="line">            indegree[prerequisite[<span class="number">0</span>]]++;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">boolean</span> flag=<span class="literal">true</span>;</span><br><span class="line">        <span class="type">int</span> count=<span class="number">0</span>;</span><br><span class="line">        <span class="keyword">while</span> (flag&amp;&amp;count&lt;numCourses)&#123;</span><br><span class="line">            flag=<span class="literal">false</span>;</span><br><span class="line">            <span class="type">int</span> i=<span class="number">0</span>;</span><br><span class="line">            <span class="keyword">while</span> (i&lt;numCourses)&#123;</span><br><span class="line">                <span class="keyword">if</span> (indegree[i]==<span class="number">0</span>)&#123;</span><br><span class="line">                    indegree[i]=-<span class="number">1</span>;</span><br><span class="line">                    res[count++]=i;</span><br><span class="line">                    flag=<span class="literal">true</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                &#125;</span><br><span class="line">                ++i;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span>[] prerequisite : prerequisites) &#123;</span><br><span class="line">                <span class="keyword">if</span> (prerequisite[<span class="number">1</span>]==i)indegree[prerequisite[<span class="number">0</span>]]--;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (count==numCourses)<span class="keyword">return</span> res;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">0</span>];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="18-152-乘积最大子数组"><a class="markdownIt-Anchor" href="#18-152-乘积最大子数组"></a> 18 <a class="link"   href="https://leetcode-cn.com/problems/maximum-product-subarray/" >152. 乘积最大子数组<i class="fas fa-external-link-alt"></i></a></h4><h5 id="题目-2"><a class="markdownIt-Anchor" href="#题目-2"></a> 题目</h5><p>给你一个整数数组 <code>nums</code> ，请你找出数组中乘积最大的连续子数组（该子数组中至少包含一个数字），并返回该子数组所对应的乘积。</p><p><strong>示例 1:</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">输入: [2,3,-2,4]</span><br><span class="line">输出: 6</span><br><span class="line">解释: 子数组 [2,3] 有最大乘积 6。</span><br></pre></td></tr></table></figure><p><strong>示例 2:</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">输入: [-2,0,-1]</span><br><span class="line">输出: 0</span><br><span class="line">解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。</span><br></pre></td></tr></table></figure><h5 id="思路-2"><a class="markdownIt-Anchor" href="#思路-2"></a> 思路</h5><p>首先的思路就是dp。写的过于复杂了一点。。</p><p>评论区带佬的代码：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">maxProduct</span><span class="params">(<span class="type">int</span>[] nums)</span> &#123;</span><br><span class="line">        <span class="type">int</span> <span class="variable">max</span> <span class="operator">=</span> Integer.MIN_VALUE, imax = <span class="number">1</span>, imin = <span class="number">1</span>; <span class="comment">//一个保存最大的，一个保存最小的。</span></span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>; i&lt;nums.length; i++)&#123;</span><br><span class="line">            <span class="keyword">if</span>(nums[i] &lt; <span class="number">0</span>)&#123; <span class="type">int</span> <span class="variable">tmp</span> <span class="operator">=</span> imax; imax = imin; imin = tmp;&#125; <span class="comment">//如果数组的数是负数，那么会导致最大的变最小的，最小的变最大的。因此交换两个的值。</span></span><br><span class="line">            imax = Math.max(imax*nums[i], nums[i]);</span><br><span class="line">            imin = Math.min(imin*nums[i], nums[i]);</span><br><span class="line">            max = Math.max(max, imax);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> max;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h5 id="code-2"><a class="markdownIt-Anchor" href="#code-2"></a> code</h5><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">maxProduct</span><span class="params">(<span class="type">int</span>[] nums)</span> &#123;</span><br><span class="line">        <span class="type">int</span> <span class="variable">res</span> <span class="operator">=</span> Integer.MIN_VALUE;</span><br><span class="line">        <span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line">        <span class="type">int</span> positive=<span class="number">1</span>;</span><br><span class="line">        <span class="type">int</span> negative=<span class="number">1</span>;</span><br><span class="line">        <span class="keyword">while</span> (i &lt; nums.length) &#123;</span><br><span class="line">            <span class="keyword">if</span> (nums[i] == <span class="number">0</span>) &#123;</span><br><span class="line">                <span class="keyword">while</span> (i&lt;nums.length&amp;&amp;nums[i] == <span class="number">0</span>) &#123;</span><br><span class="line">                    ++i;</span><br><span class="line">                    res = Math.max(res,<span class="number">0</span>);</span><br><span class="line">                &#125;</span><br><span class="line">                positive=<span class="number">1</span>;</span><br><span class="line">                negative=<span class="number">1</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (i==nums.length)<span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">if</span> (nums[i]&gt;<span class="number">0</span>)&#123;</span><br><span class="line">                positive*=nums[i];</span><br><span class="line">                negative*=nums[i];</span><br><span class="line">                res=Math.max(res,positive);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span> &#123;</span><br><span class="line">                <span class="keyword">if</span> (negative&lt;<span class="number">0</span>)&#123;</span><br><span class="line">                    <span class="type">int</span> tmp=positive;</span><br><span class="line">                    positive=negative*nums[i];</span><br><span class="line">                    res=Math.max(res,positive);</span><br><span class="line">                    negative=tmp*nums[i];</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">else</span> &#123;</span><br><span class="line">                    negative=positive*nums[i];</span><br><span class="line">                    positive=<span class="number">1</span>;</span><br><span class="line">                    res=Math.max(res,negative);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            ++i;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="19-680-验证回文字符串-ii"><a class="markdownIt-Anchor" href="#19-680-验证回文字符串-ii"></a> 19 <a class="link"   href="https://leetcode-cn.com/problems/valid-palindrome-ii/" >680. 验证回文字符串 Ⅱ<i class="fas fa-external-link-alt"></i></a></h4><h5 id="题目-3"><a class="markdownIt-Anchor" href="#题目-3"></a> 题目</h5><p>给定一个非空字符串 <code>s</code>，<strong>最多</strong>删除一个字符。判断是否能成为回文字符串。</p><p><strong>示例 1:</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">输入: &quot;aba&quot;</span><br><span class="line">输出: True</span><br></pre></td></tr></table></figure><p><strong>示例 2:</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">输入: &quot;abca&quot;</span><br><span class="line">输出: True</span><br><span class="line">解释: 你可以删除c字符。</span><br></pre></td></tr></table></figure><p><strong>注意:</strong></p><ol><li>字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。</li></ol><h5 id="思路-3"><a class="markdownIt-Anchor" href="#思路-3"></a> 思路</h5><p>简单的双指针，一个指向头，一个指向尾，因为有一次删除的机会，所以第一次遇到不相等的字符时，可以left+1，或right-1；之后在遇到直接返回false。指针走位则为true。</p><h5 id="code-3"><a class="markdownIt-Anchor" href="#code-3"></a> code</h5><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">        <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">validPalindrome</span><span class="params">(String s)</span> &#123;</span><br><span class="line">        <span class="type">int</span> left=<span class="number">0</span>,right=s.length()-<span class="number">1</span>;</span><br><span class="line">        <span class="keyword">while</span> (left&lt;right)&#123;</span><br><span class="line">            <span class="keyword">if</span> (s.charAt(left)!=s.charAt(right))&#123;</span><br><span class="line">                <span class="keyword">return</span> validPalindrome(s,left+<span class="number">1</span>,right)||validPalindrome(s,left,right-<span class="number">1</span>);</span><br><span class="line">            &#125;</span><br><span class="line">            left++;right--;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">validPalindrome</span><span class="params">(String s,<span class="type">int</span> left,<span class="type">int</span> right)</span>&#123;</span><br><span class="line">        <span class="keyword">while</span> (left&lt;right)&#123;</span><br><span class="line">            <span class="keyword">if</span> (s.charAt(left)!=s.charAt(right))&#123;</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            left++;right--;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="20-1371-每个元音包含偶数次的最长子字符串"><a class="markdownIt-Anchor" href="#20-1371-每个元音包含偶数次的最长子字符串"></a> 20 <a class="link"   href="https://leetcode-cn.com/problems/find-the-longest-substring-containing-vowels-in-even-counts/" >1371. 每个元音包含偶数次的最长子字符串<i class="fas fa-external-link-alt"></i></a></h4><h5 id="题目-4"><a class="markdownIt-Anchor" href="#题目-4"></a> 题目</h5><p>给你一个字符串 <code>s</code> ，请你返回满足以下条件的最长子字符串的长度：每个元音字母，即 ‘a’，‘e’，‘i’，‘o’，‘u’ ，在子字符串中都恰好出现了偶数次。</p><p>示例 1：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">输入：s = &quot;eleetminicoworoep&quot;</span><br><span class="line">输出：13</span><br><span class="line">解释：最长子字符串是 &quot;leetminicowor&quot; ，它包含 e，i，o 各 2 个，以及 0 个 a，u 。</span><br></pre></td></tr></table></figure><p>示例 2：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">输入：s = &quot;leetcodeisgreat&quot;</span><br><span class="line">输出：5</span><br><span class="line">解释：最长子字符串是 &quot;leetc&quot; ，其中包含 2 个 e 。</span><br></pre></td></tr></table></figure><p>示例 3：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">输入：s = &quot;bcbcbc&quot;</span><br><span class="line">输出：6</span><br><span class="line">解释：这个示例中，字符串 &quot;bcbcbc&quot; 本身就是最长的，因为所有的元音 a，e，i，o，u 都出现了 0 次。</span><br></pre></td></tr></table></figure><p>提示：</p><ul><li>1 &lt;= s.length &lt;= 5 x 10^5</li><li>s 只包含小写英文字母。</li></ul><h5 id="思路-4"><a class="markdownIt-Anchor" href="#思路-4"></a> 思路</h5><p>第一感觉没啥好的想法，先暴力试一下。</p><p>从后往前遍历，主要是要确定左边可以的位置。按照单个字母来看，每次左边可以的位置要么是0，要么是第一次位置的下一位。所以我们记录一下每个字母第一次出现的位置和目前字母是否为偶数即可。然后取五个字母可以的最大值作为left。大部分情况下成功。。。</p><p>5个数的奇偶一共有32种状态，记录每个状态最早出现的位置。如果子串[0，i]与字串[0,j]状态相同，那么字串[i+1,j]的状态一定是0。上面的思路错误的原因就是因为没有一起记录，是单个记录的。</p><h5 id="code-4"><a class="markdownIt-Anchor" href="#code-4"></a> code</h5><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">findTheLongestSubstring</span><span class="params">(String s)</span> &#123;</span><br><span class="line">        Map&lt;Character,Integer&gt; map=<span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;(<span class="number">5</span>);</span><br><span class="line">        map.put(<span class="string">&#x27;a&#x27;</span>,<span class="number">1</span>);map.put(<span class="string">&#x27;e&#x27;</span>,<span class="number">2</span>);map.put(<span class="string">&#x27;i&#x27;</span>,<span class="number">4</span>);</span><br><span class="line">        map.put(<span class="string">&#x27;o&#x27;</span>,<span class="number">8</span>);map.put(<span class="string">&#x27;u&#x27;</span>,<span class="number">16</span>);</span><br><span class="line">        <span class="type">int</span>[] location=<span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">32</span>];</span><br><span class="line">        Arrays.fill(location,-<span class="number">1</span>);</span><br><span class="line">        location[<span class="number">0</span>]=<span class="number">0</span>;</span><br><span class="line">        <span class="type">int</span> status=<span class="number">0</span>,res=<span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; s.length(); i++) &#123;</span><br><span class="line">            <span class="type">char</span> c=s.charAt(i);</span><br><span class="line">            <span class="keyword">if</span> (c==<span class="string">&#x27;a&#x27;</span>||c==<span class="string">&#x27;e&#x27;</span>||c==<span class="string">&#x27;i&#x27;</span>||c==<span class="string">&#x27;o&#x27;</span>||c==<span class="string">&#x27;u&#x27;</span>)&#123;</span><br><span class="line">                status^=map.get(c);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (location[status]==-<span class="number">1</span>)location[status]=i+<span class="number">1</span>;</span><br><span class="line">            <span class="keyword">else</span> res=Math.max(res,i+<span class="number">1</span>-location[status]);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">错误代码：</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">findTheLongestSubstring</span><span class="params">(String s)</span> &#123;</span><br><span class="line">        <span class="type">int</span>[][] count=<span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">26</span>][<span class="number">2</span>];</span><br><span class="line">        <span class="type">int</span> left=<span class="number">0</span>;</span><br><span class="line">        <span class="type">int</span> res=<span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; s.length(); i++) &#123;</span><br><span class="line">            <span class="type">char</span> c=s.charAt(i);</span><br><span class="line">            <span class="keyword">if</span> (c==<span class="string">&#x27;a&#x27;</span>||c==<span class="string">&#x27;e&#x27;</span>||c==<span class="string">&#x27;i&#x27;</span>||c==<span class="string">&#x27;o&#x27;</span>||c==<span class="string">&#x27;u&#x27;</span>)&#123;</span><br><span class="line">                <span class="keyword">if</span> (count[c-<span class="string">&#x27;a&#x27;</span>][<span class="number">1</span>]==<span class="number">0</span>)&#123;</span><br><span class="line">                    count[c-<span class="string">&#x27;a&#x27;</span>][<span class="number">1</span>]=i+<span class="number">1</span>;</span><br><span class="line">                    count[c-<span class="string">&#x27;a&#x27;</span>][<span class="number">0</span>]=i+<span class="number">1</span>;</span><br><span class="line">                    left=i+<span class="number">1</span>;</span><br><span class="line">                &#125;<span class="keyword">else</span> &#123;</span><br><span class="line">                    <span class="keyword">if</span> (count[c-<span class="string">&#x27;a&#x27;</span>][<span class="number">0</span>]==<span class="number">0</span>)&#123;</span><br><span class="line">                        count[c-<span class="string">&#x27;a&#x27;</span>][<span class="number">0</span>]=count[c-<span class="string">&#x27;a&#x27;</span>][<span class="number">1</span>];</span><br><span class="line">                        left=Math.max(left,count[c-<span class="string">&#x27;a&#x27;</span>][<span class="number">1</span>]);</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">else</span> &#123;</span><br><span class="line">                       <span class="keyword">if</span> (left!=count[c-<span class="string">&#x27;a&#x27;</span>][<span class="number">0</span>])&#123;</span><br><span class="line">                           count[c-<span class="string">&#x27;a&#x27;</span>][<span class="number">0</span>]=<span class="number">0</span>;</span><br><span class="line">                       &#125;<span class="keyword">else</span> &#123;</span><br><span class="line">                            count[c-<span class="string">&#x27;a&#x27;</span>][<span class="number">0</span>]=<span class="number">0</span>;</span><br><span class="line">                            left=Math.max(count[<span class="number">0</span>][<span class="number">0</span>],Math.max(count[<span class="string">&#x27;e&#x27;</span>-<span class="string">&#x27;a&#x27;</span>][<span class="number">0</span>],Math.max(count[<span class="string">&#x27;i&#x27;</span>-<span class="string">&#x27;a&#x27;</span>][<span class="number">0</span>],Math.max(count[<span class="string">&#x27;o&#x27;</span>-<span class="string">&#x27;a&#x27;</span>][<span class="number">0</span>],count[<span class="string">&#x27;u&#x27;</span>-<span class="string">&#x27;a&#x27;</span>][<span class="number">0</span>]))));</span><br><span class="line">                       &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            res=Math.max(res,i+<span class="number">1</span>-left);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="21-5-最长回文子串"><a class="markdownIt-Anchor" href="#21-5-最长回文子串"></a> 21 <a class="link"   href="https://leetcode-cn.com/problems/longest-palindromic-substring/" >5. 最长回文子串<i class="fas fa-external-link-alt"></i></a></h4><h5 id="题目-5"><a class="markdownIt-Anchor" href="#题目-5"></a> 题目</h5><p>给定一个字符串 <code>s</code>，找到 <code>s</code> 中最长的回文子串。你可以假设 <code>s</code> 的最大长度为 1000。</p><p><strong>示例 1：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">输入: &quot;babad&quot;</span><br><span class="line">输出: &quot;bab&quot;</span><br><span class="line">注意: &quot;aba&quot; 也是一个有效答案。</span><br></pre></td></tr></table></figure><p><strong>示例 2：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">输入: &quot;cbbd&quot;</span><br><span class="line">输出: &quot;bb&quot;</span><br></pre></td></tr></table></figure><h5 id="思路-5"><a class="markdownIt-Anchor" href="#思路-5"></a> 思路</h5><p>动态规划，<code>dp[i][j]</code>记录从i到j子串是否回文，依次找长度从2到字符串长度的回文子串，dp[i][j]=(s[i]==s[j] \and dp[i+1][j-1])。</p><h5 id="code-5"><a class="markdownIt-Anchor" href="#code-5"></a> code</h5><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">longestPalindrome</span><span class="params">(String s)</span> &#123;</span><br><span class="line">        <span class="type">int</span> len=s.length();</span><br><span class="line">        <span class="keyword">if</span> (len&lt;<span class="number">2</span>)<span class="keyword">return</span> s;</span><br><span class="line">        <span class="type">boolean</span>[][] dp=<span class="keyword">new</span> <span class="title class_">boolean</span>[len][len];</span><br><span class="line">        String res=s.substring(<span class="number">0</span>,<span class="number">1</span>);</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; len-<span class="number">1</span>; i++) &#123;</span><br><span class="line">            dp[i][i]=<span class="literal">true</span>;</span><br><span class="line">            <span class="keyword">if</span> (s.charAt(i)==s.charAt(i+<span class="number">1</span>))&#123;</span><br><span class="line">                dp[i][i+<span class="number">1</span>]=<span class="literal">true</span>;</span><br><span class="line">                res=s.substring(i,i+<span class="number">2</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        dp[len-<span class="number">1</span>][len-<span class="number">1</span>]=<span class="literal">true</span>;</span><br><span class="line">        <span class="type">int</span> step=<span class="number">3</span>;</span><br><span class="line">        <span class="keyword">while</span> (step &lt;= len) &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; len - step + <span class="number">1</span>; i++) &#123;</span><br><span class="line">                <span class="keyword">if</span> (s.charAt(i) == s.charAt(i + step - <span class="number">1</span>) &amp;&amp; dp[i + <span class="number">1</span>][i + step - <span class="number">2</span>]) &#123;</span><br><span class="line">                    dp[i][i + step - <span class="number">1</span>] = <span class="literal">true</span>;</span><br><span class="line">                    res = s.substring(i, i + step);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            ++step;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="22-105-从前序与中序遍历序列构造二叉树"><a class="markdownIt-Anchor" href="#22-105-从前序与中序遍历序列构造二叉树"></a> 22 <a class="link"   href="https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/" >105. 从前序与中序遍历序列构造二叉树<i class="fas fa-external-link-alt"></i></a></h4><h5 id="题目-6"><a class="markdownIt-Anchor" href="#题目-6"></a> 题目</h5><p>根据一棵树的前序遍历与中序遍历构造二叉树。</p><p><strong>注意:</strong><br />你可以假设树中没有重复的元素。</p><p>例如，给出</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">前序遍历 preorder = [3,9,20,15,7]</span><br><span class="line">中序遍历 inorder = [9,3,15,20,7]</span><br></pre></td></tr></table></figure><p>返回如下的二叉树：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">  3</span><br><span class="line"> / \</span><br><span class="line">9  20</span><br><span class="line">  /  \</span><br><span class="line"> 15   7</span><br></pre></td></tr></table></figure><h5 id="思路-6"><a class="markdownIt-Anchor" href="#思路-6"></a> 思路</h5><p>递归，每次得到两个序列，前序的第一个元素即根结点，中序遍历以根为分界分为左右子树序列。</p><h5 id="code-6"><a class="markdownIt-Anchor" href="#code-6"></a> code</h5><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">(这里直接贴了官方的代码,不想写了。。)</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> TreeNode <span class="title function_">buildTree</span><span class="params">(<span class="type">int</span>[] preorder, <span class="type">int</span>[] inorder)</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (preorder == <span class="literal">null</span> || preorder.length == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        Map&lt;Integer, Integer&gt; indexMap = <span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;Integer, Integer&gt;();</span><br><span class="line">        <span class="type">int</span> <span class="variable">length</span> <span class="operator">=</span> preorder.length;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; length; i++) &#123;</span><br><span class="line">            indexMap.put(inorder[i], i);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">TreeNode</span> <span class="variable">root</span> <span class="operator">=</span> buildTree(preorder, <span class="number">0</span>, length - <span class="number">1</span>, inorder, <span class="number">0</span>, length - <span class="number">1</span>, indexMap);</span><br><span class="line">        <span class="keyword">return</span> root;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> TreeNode <span class="title function_">buildTree</span><span class="params">(<span class="type">int</span>[] preorder, <span class="type">int</span> preorderStart, <span class="type">int</span> preorderEnd, <span class="type">int</span>[] inorder, <span class="type">int</span> inorderStart, <span class="type">int</span> inorderEnd, Map&lt;Integer, Integer&gt; indexMap)</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (preorderStart &gt; preorderEnd) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> <span class="variable">rootVal</span> <span class="operator">=</span> preorder[preorderStart];</span><br><span class="line">        <span class="type">TreeNode</span> <span class="variable">root</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">TreeNode</span>(rootVal);</span><br><span class="line">        <span class="keyword">if</span> (preorderStart == preorderEnd) &#123;</span><br><span class="line">            <span class="keyword">return</span> root;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="type">int</span> <span class="variable">rootIndex</span> <span class="operator">=</span> indexMap.get(rootVal);</span><br><span class="line">            <span class="type">int</span> <span class="variable">leftNodes</span> <span class="operator">=</span> rootIndex - inorderStart, rightNodes = inorderEnd - rootIndex;</span><br><span class="line">            <span class="type">TreeNode</span> <span class="variable">leftSubtree</span> <span class="operator">=</span> buildTree(preorder, preorderStart + <span class="number">1</span>, preorderStart + leftNodes, inorder, inorderStart, rootIndex - <span class="number">1</span>, indexMap);</span><br><span class="line">            <span class="type">TreeNode</span> <span class="variable">rightSubtree</span> <span class="operator">=</span> buildTree(preorder, preorderEnd - rightNodes + <span class="number">1</span>, preorderEnd, inorder, rootIndex + <span class="number">1</span>, inorderEnd, indexMap);</span><br><span class="line">            root.left = leftSubtree;</span><br><span class="line">            root.right = rightSubtree;</span><br><span class="line">            <span class="keyword">return</span> root;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="23-76-最小覆盖子串"><a class="markdownIt-Anchor" href="#23-76-最小覆盖子串"></a> 23 <a class="link"   href="https://leetcode-cn.com/problems/minimum-window-substring/" >76. 最小覆盖子串<i class="fas fa-external-link-alt"></i></a></h4><h5 id="题目-7"><a class="markdownIt-Anchor" href="#题目-7"></a> 题目</h5><p>给你一个字符串 S、一个字符串 T，请在字符串 S 里面找出：包含 T 所有字符的最小子串。</p><p><strong>示例：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">输入: S = &quot;ADOBECODEBANC&quot;, T = &quot;ABC&quot;</span><br><span class="line">输出: &quot;BANC&quot;</span><br></pre></td></tr></table></figure><p><strong>说明：</strong></p><ul><li>如果 S 中不存这样的子串，则返回空字符串 <code>&quot;&quot;</code>。</li><li>如果 S 中存在这样的子串，我们保证它是唯一的答案。</li></ul><h5 id="思路-7"><a class="markdownIt-Anchor" href="#思路-7"></a> 思路</h5><p>滑动窗口，哈希表记录当前的T中字符的数量。</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">minWindow</span><span class="params">(s <span class="type">string</span>, t <span class="type">string</span>)</span></span> <span class="type">string</span> &#123;</span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(s) &lt; <span class="built_in">len</span>(t) &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line">&#125;</span><br><span class="line">hash := <span class="built_in">make</span>(<span class="keyword">map</span>[<span class="type">byte</span>]<span class="type">int</span>)</span><br><span class="line"><span class="keyword">for</span> i := <span class="number">0</span>; i &lt; <span class="built_in">len</span>(t); i++ &#123;</span><br><span class="line">hash[t[i]]++</span><br><span class="line">&#125;</span><br><span class="line">l, count, max, results := <span class="number">0</span>, <span class="built_in">len</span>(t), <span class="built_in">len</span>(s)+<span class="number">1</span>, <span class="string">&quot;&quot;</span></span><br><span class="line"><span class="keyword">for</span> r := <span class="number">0</span>; r &lt; <span class="built_in">len</span>(s); r++ &#123;</span><br><span class="line"><span class="keyword">if</span> _,ok:=hash[s[r]];ok &#123;</span><br><span class="line">hash[s[r]]--</span><br><span class="line"><span class="keyword">if</span> hash[s[r]] &gt;= <span class="number">0</span> &#123;</span><br><span class="line">count--</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> l &lt; r &#123;</span><br><span class="line"><span class="keyword">if</span> _, ok := hash[s[l]]; ok &#123;</span><br><span class="line"><span class="keyword">if</span> hash[s[l]] &lt; <span class="number">0</span> &#123;</span><br><span class="line">hash[s[l]]++</span><br><span class="line">&#125;<span class="keyword">else</span> &#123;</span><br><span class="line"><span class="keyword">break</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">l++</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> count == <span class="number">0</span> &amp;&amp; max &gt; r-l+<span class="number">1</span> &#123;</span><br><span class="line">max = r - l + <span class="number">1</span></span><br><span class="line">results = s[l : r+<span class="number">1</span>]</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> results</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="24-4-寻找两个正序数组的中位数"><a class="markdownIt-Anchor" href="#24-4-寻找两个正序数组的中位数"></a> 24 <a class="link"   href="https://leetcode-cn.com/problems/median-of-two-sorted-arrays/" >4. 寻找两个正序数组的中位数<i class="fas fa-external-link-alt"></i></a></h4><h5 id="题目-8"><a class="markdownIt-Anchor" href="#题目-8"></a> 题目</h5><p>给定两个大小为 m 和 n 的正序（从小到大）数组 <code>nums1</code> 和 <code>nums2</code>。</p><p>请你找出这两个正序数组的中位数，并且要求算法的时间复杂度为 O(log(m + n))。</p><p>你可以假设 <code>nums1</code> 和 <code>nums2</code> 不会同时为空。</p><p><strong>示例 1:</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">nums1 = [1, 3]</span><br><span class="line">nums2 = [2]</span><br><span class="line"></span><br><span class="line">则中位数是 2.0</span><br></pre></td></tr></table></figure><p><strong>示例 2:</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">nums1 = [1, 2]</span><br><span class="line">nums2 = [3, 4]</span><br><span class="line"></span><br><span class="line">则中位数是 (2 + 3)/2 = 2.5</span><br></pre></td></tr></table></figure><h5 id="思路-8"><a class="markdownIt-Anchor" href="#思路-8"></a> 思路</h5><p>二分，两个数组找第k大的数。先分别取两个数组第k/2个数，然后进行比较丢弃。</p><h5 id="code-7"><a class="markdownIt-Anchor" href="#code-7"></a> Code</h5><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">double</span> <span class="title function_">findMedianSortedArrays</span><span class="params">(<span class="type">int</span>[] nums1, <span class="type">int</span>[] nums2)</span> &#123;</span><br><span class="line">        <span class="type">int</span> len=nums1.length+nums2.length;</span><br><span class="line">        <span class="keyword">if</span> (len%<span class="number">2</span>!=<span class="number">0</span>)&#123;</span><br><span class="line">            <span class="keyword">return</span> help(nums1,nums2,<span class="number">0</span>,nums1.length,<span class="number">0</span>,nums2.length,len/<span class="number">2</span>+<span class="number">1</span>);</span><br><span class="line">        &#125;<span class="keyword">else</span> <span class="keyword">return</span> (help(nums1,nums2,<span class="number">0</span>,nums1.length,<span class="number">0</span>,nums2.length,len/<span class="number">2</span>)+help(nums1,nums2,<span class="number">0</span>,nums1.length,<span class="number">0</span>,nums2.length,len/<span class="number">2</span>+<span class="number">1</span>))/<span class="number">2</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">double</span> <span class="title function_">help</span><span class="params">(<span class="type">int</span>[] nums1,<span class="type">int</span>[] nums2,<span class="type">int</span> l1,<span class="type">int</span> r1,<span class="type">int</span> l2,<span class="type">int</span> r2,<span class="type">int</span> k)</span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (l1==r1)<span class="keyword">return</span> nums2[l2+k-<span class="number">1</span>];</span><br><span class="line">        <span class="keyword">if</span> (l2==r2)<span class="keyword">return</span> nums1[l1+k-<span class="number">1</span>];</span><br><span class="line">        <span class="keyword">if</span> (k==<span class="number">1</span>) <span class="keyword">return</span> Math.min(nums1[l1],nums2[l2]);</span><br><span class="line">        <span class="type">int</span> mid1=Integer.MAX_VALUE;</span><br><span class="line">        <span class="type">int</span> mid2=Integer.MAX_VALUE;</span><br><span class="line">        <span class="keyword">if</span> ((k+<span class="number">1</span>)/<span class="number">2</span>-<span class="number">1</span>&lt;r1-l1)mid1=nums1[l1+(k+<span class="number">1</span>)/<span class="number">2</span>-<span class="number">1</span>];</span><br><span class="line">        <span class="keyword">if</span> ((k+<span class="number">1</span>)/<span class="number">2</span>-<span class="number">1</span>&lt;r2-l2)mid2=nums2[l2+(k+<span class="number">1</span>)/<span class="number">2</span>-<span class="number">1</span>];</span><br><span class="line">        <span class="keyword">if</span> (mid1==mid2)<span class="keyword">return</span> mid1;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span> (mid1&lt;mid2)&#123;</span><br><span class="line">            <span class="keyword">return</span> help(nums1,nums2,l1+k/<span class="number">2</span>,r1,l2,r2,k-k/<span class="number">2</span>);</span><br><span class="line">        &#125;<span class="keyword">else</span> <span class="keyword">return</span> help(nums1,nums2,l1,r1,k/<span class="number">2</span>+l2,r2,k-k/<span class="number">2</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="25-146-lru缓存机制"><a class="markdownIt-Anchor" href="#25-146-lru缓存机制"></a> 25 <a class="link"   href="https://leetcode-cn.com/problems/lru-cache/" >146. LRU缓存机制<i class="fas fa-external-link-alt"></i></a></h4><h5 id="题目-9"><a class="markdownIt-Anchor" href="#题目-9"></a> 题目</h5><p>运用你所掌握的数据结构，设计和实现一个 <a class="link"   href="https://baike.baidu.com/item/LRU" >LRU (最近最少使用) 缓存机制<i class="fas fa-external-link-alt"></i></a>。它应该支持以下操作： 获取数据 <code>get</code> 和 写入数据 <code>put</code> 。</p><p>获取数据 <code>get(key)</code> - 如果密钥 (key) 存在于缓存中，则获取密钥的值（总是正数），否则返回 -1。</p><p>写入数据 <code>put(key, value)</code> - 如果密钥已经存在，则变更其数据值；如果密钥不存在，则插入该组「密钥/数据值」。当缓存容量达到上限时，它应该在写入新数据之前删除最久未使用的数据值，从而为新的数据值留出空间。</p><p><strong>进阶:</strong></p><p>你是否可以在 <strong>O(1)</strong> 时间复杂度内完成这两种操作？</p><p>示例:</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">LRUCache</span> <span class="variable">cache</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">LRUCache</span>( <span class="number">2</span> <span class="comment">/* 缓存容量 */</span> );</span><br><span class="line">cache.put(<span class="number">1</span>, <span class="number">1</span>);</span><br><span class="line">cache.put(<span class="number">2</span>, <span class="number">2</span>);</span><br><span class="line">cache.get(<span class="number">1</span>);       <span class="comment">// 返回  1</span></span><br><span class="line">cache.put(<span class="number">3</span>, <span class="number">3</span>);    <span class="comment">// 该操作会使得密钥 2 作废</span></span><br><span class="line">cache.get(<span class="number">2</span>);       <span class="comment">// 返回 -1 (未找到)</span></span><br><span class="line">cache.put(<span class="number">4</span>, <span class="number">4</span>);    <span class="comment">// 该操作会使得密钥 1 作废</span></span><br><span class="line">cache.get(<span class="number">1</span>);       <span class="comment">// 返回 -1 (未找到)</span></span><br><span class="line">cache.get(<span class="number">3</span>);       <span class="comment">// 返回  3</span></span><br><span class="line">cache.get(<span class="number">4</span>);       <span class="comment">// 返回  4</span></span><br></pre></td></tr></table></figure><h5 id="思路-9"><a class="markdownIt-Anchor" href="#思路-9"></a> 思路</h5><p>Hash表+双向链表。Hash直接使用HashMap存储键到链表节点的映射，自定义简单的双向链表存储键值对。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">LRUCache</span> &#123;</span><br><span class="line">    <span class="keyword">class</span> <span class="title class_">ListNode</span>&#123;</span><br><span class="line">        <span class="keyword">public</span> ListNode last;</span><br><span class="line">        <span class="keyword">public</span> ListNode next;</span><br><span class="line">        <span class="type">int</span> val;</span><br><span class="line">        <span class="type">int</span> key;</span><br><span class="line">        <span class="keyword">public</span> <span class="title function_">ListNode</span><span class="params">(<span class="type">int</span> k,<span class="type">int</span> v)</span>&#123;</span><br><span class="line">            key=k;val=v;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="type">int</span> capacity;</span><br><span class="line">    <span class="keyword">private</span> Map&lt;Integer,ListNode&gt; map;</span><br><span class="line">    ListNode head=<span class="literal">null</span>;</span><br><span class="line">    ListNode tail=<span class="literal">null</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">LRUCache</span><span class="params">(<span class="type">int</span> capacity)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.capacity=capacity;</span><br><span class="line">        map=<span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">get</span><span class="params">(<span class="type">int</span> key)</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (!map.containsKey(key))</span><br><span class="line">            <span class="keyword">return</span> -<span class="number">1</span>;</span><br><span class="line">        ListNode cur=map.get(key);</span><br><span class="line">        <span class="keyword">if</span> (cur==head)<span class="keyword">return</span> cur.val;</span><br><span class="line">        <span class="keyword">if</span> (cur.last!=<span class="literal">null</span>)&#123;</span><br><span class="line">            cur.last.next=cur.next;</span><br><span class="line">            <span class="keyword">if</span> (cur.next!=<span class="literal">null</span>)&#123;</span><br><span class="line">                cur.next.last=cur.last;</span><br><span class="line">            &#125;<span class="keyword">else</span> &#123;</span><br><span class="line">                tail=cur.last;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        cur.next=head;</span><br><span class="line">        head.last=cur;</span><br><span class="line">        head=cur;</span><br><span class="line">        <span class="keyword">return</span> cur.val;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">put</span><span class="params">(<span class="type">int</span> key, <span class="type">int</span> value)</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (map.containsKey(key))&#123;</span><br><span class="line">            map.get(key).val=value;</span><br><span class="line">            get(key);</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        ListNode node=<span class="keyword">new</span> <span class="title class_">ListNode</span>(key,value);</span><br><span class="line">        <span class="keyword">if</span> (head==<span class="literal">null</span>)&#123;</span><br><span class="line">            head=tail=node;</span><br><span class="line">        &#125;<span class="keyword">else</span> &#123;</span><br><span class="line">            node.next=head;</span><br><span class="line">            head.last=node;</span><br><span class="line">            head=node;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (map.size()==capacity)&#123;</span><br><span class="line">            map.remove(tail.key);</span><br><span class="line">            tail=tail.last;</span><br><span class="line">            tail.next=<span class="literal">null</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        map.put(key,node);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img  
                     lazyload
                     src=&quot;/images/loading.svg&quot;
                     data-src=&quot;20-05-leetcode/33ba6a6</summary>
      
    
    
    
    <category term="algorithm" scheme="https://nn.ci/categories/algorithm/"/>
    
    
    <category term="leetcode" scheme="https://nn.ci/tags/leetcode/"/>
    
  </entry>
  
  <entry>
    <title>hexo-next增加友链页面</title>
    <link href="https://nn.ci/posts/hexo-next-add-links.html"/>
    <id>https://nn.ci/posts/hexo-next-add-links.html</id>
    <published>2020-04-28T09:20:18.000Z</published>
    <updated>2020-04-28T09:20:18.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="新增links页面"><a class="markdownIt-Anchor" href="#新增links页面"></a> 新增links页面</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new page links</span><br></pre></td></tr></table></figure><span id="more"></span><h2 id="配置menu"><a class="markdownIt-Anchor" href="#配置menu"></a> 配置menu</h2><p>主题配置文件<code>_config.yml</code>中<code>menu</code>下添加：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">links:</span> <span class="string">/links/</span> <span class="string">||</span> <span class="string">link</span></span><br></pre></td></tr></table></figure><p><code>/themes/next/languages/zh-Hans.yml</code>文件中<code>menu</code>下增加中文描述：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">links:</span> <span class="string">友链</span></span><br></pre></td></tr></table></figure><p>做完这些工作，接下来就是要增加友链页面的样式了</p><h2 id="新增linksswig页"><a class="markdownIt-Anchor" href="#新增linksswig页"></a> 新增<code>links.swig</code>页</h2><p>在<code>/themes/next/layout/</code>新建<code>links.swig</code>，内容如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br></pre></td><td class="code"><pre><span class="line">&#123;% block content %&#125;</span><br><span class="line">  &#123;######################&#125;</span><br><span class="line">  &#123;### LINKS BLOCK ###&#125;</span><br><span class="line">  &#123;######################&#125;</span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;links&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">            <span class="selector-id">#links</span>&#123;</span></span><br><span class="line"><span class="language-css">               <span class="attribute">margin-top</span>: <span class="number">5rem</span>;</span></span><br><span class="line"><span class="language-css">            &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">            <span class="selector-class">.links-content</span>&#123;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">margin-top</span>:<span class="number">1rem</span>;</span></span><br><span class="line"><span class="language-css">            &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">            <span class="selector-class">.link-navigation</span><span class="selector-pseudo">::after</span> &#123;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">content</span>: <span class="string">&quot; &quot;</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">display</span>: block;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">clear</span>: both;</span></span><br><span class="line"><span class="language-css">            &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">            <span class="selector-class">.card</span> &#123;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">width</span>: <span class="number">300px</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">font-size</span>: <span class="number">1rem</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">padding</span>: <span class="number">10px</span> <span class="number">20px</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">border-radius</span>: <span class="number">4px</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">transition-duration</span>: <span class="number">0.15s</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">margin-bottom</span>: <span class="number">1rem</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">display</span>:flex;</span></span><br><span class="line"><span class="language-css">            &#125;</span></span><br><span class="line"><span class="language-css">            <span class="selector-class">.card</span><span class="selector-pseudo">:nth-child</span>(odd) &#123;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">float</span>: left;</span></span><br><span class="line"><span class="language-css">            &#125;</span></span><br><span class="line"><span class="language-css">            <span class="selector-class">.card</span><span class="selector-pseudo">:nth-child</span>(even) &#123;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">float</span>: right;</span></span><br><span class="line"><span class="language-css">            &#125;</span></span><br><span class="line"><span class="language-css">            <span class="selector-class">.card</span><span class="selector-pseudo">:hover</span> &#123;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>);</span></span><br><span class="line"><span class="language-css">                <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">2px</span> <span class="number">6px</span> <span class="number">0</span> <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.12</span>), <span class="number">0</span> <span class="number">0</span> <span class="number">6px</span> <span class="number">0</span> <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.04</span>);</span></span><br><span class="line"><span class="language-css">            &#125;</span></span><br><span class="line"><span class="language-css">            <span class="selector-class">.card</span> <span class="selector-tag">a</span> &#123;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">border</span>:none;</span></span><br><span class="line"><span class="language-css">            &#125;</span></span><br><span class="line"><span class="language-css">            <span class="selector-class">.card</span> <span class="selector-class">.ava</span> &#123;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">width</span>: <span class="number">3rem</span><span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">height</span>: <span class="number">3rem</span><span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">margin</span>:<span class="number">0</span><span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">margin-right</span>: <span class="number">1em</span><span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">border-radius</span>:<span class="number">4px</span>;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">            &#125;</span></span><br><span class="line"><span class="language-css">            <span class="selector-class">.card</span> <span class="selector-class">.card-header</span> &#123;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">font-style</span>: italic;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">overflow</span>: hidden;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">width</span>: <span class="number">236px</span>;</span></span><br><span class="line"><span class="language-css">            &#125;</span></span><br><span class="line"><span class="language-css">            <span class="selector-class">.card</span> <span class="selector-class">.card-header</span> <span class="selector-tag">a</span> &#123;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">font-style</span>: normal;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">color</span>: <span class="number">#2bbc8a</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">font-weight</span>: bold;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">text-decoration</span>: none;</span></span><br><span class="line"><span class="language-css">            &#125;</span></span><br><span class="line"><span class="language-css">            <span class="selector-class">.card</span> <span class="selector-class">.card-header</span> <span class="selector-tag">a</span><span class="selector-pseudo">:hover</span> &#123;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">color</span>: <span class="number">#d480aa</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">text-decoration</span>: none;</span></span><br><span class="line"><span class="language-css">            &#125;</span></span><br><span class="line"><span class="language-css">            <span class="selector-class">.card</span> <span class="selector-class">.card-header</span> <span class="selector-class">.info</span> &#123;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">font-style</span>:normal;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">color</span>:<span class="number">#a3a3a3</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">font-size</span>:<span class="number">14px</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">min-width</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">text-overflow</span>: ellipsis;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">overflow</span>: hidden;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">white-space</span>: nowrap;</span></span><br><span class="line"><span class="language-css">            &#125;</span></span><br><span class="line"><span class="language-css">        </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;links-content&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;link-navigation&quot;</span>&gt;</span></span><br><span class="line"></span><br><span class="line">                &#123;% for link in theme.friendlinks %&#125;</span><br><span class="line"></span><br><span class="line">                    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;card&quot;</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;<span class="name">img</span> <span class="attr">class</span>=<span class="string">&quot;ava&quot;</span> <span class="attr">src</span>=<span class="string">&quot;&#123;&#123; link.avatar &#125;&#125;&quot;</span>/&gt;</span></span><br><span class="line">                        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;card-header&quot;</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;<span class="name">div</span>&gt;</span><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;&#123;&#123; link.site &#125;&#125;&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span>@ &#123;&#123; link.nickname &#125;&#125;<span class="tag">&lt;/<span class="name">a</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;info&quot;</span>&gt;</span>&#123;&#123; link.info &#125;&#125;<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line">                &#123;% endfor %&#125;</span><br><span class="line"></span><br><span class="line">            <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">            &#123;&#123; page.content &#125;&#125;</span><br><span class="line">            <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line">  &#123;##########################&#125;</span><br><span class="line">  &#123;### END LINKS BLOCK ###&#125;</span><br><span class="line">  &#123;##########################&#125;</span><br><span class="line">&#123;% endblock %&#125;</span><br></pre></td></tr></table></figure><h2 id="修改pageswig"><a class="markdownIt-Anchor" href="#修改pageswig"></a> 修改page.swig</h2><p>修改<code>/themes/next/layout/page.swig</code>文件，在</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&#123;% elif page.<span class="property">type</span> === <span class="string">&quot;tags&quot;</span> and not page.<span class="property">title</span> %&#125;</span><br><span class="line">    &#123;&#123; <span class="title function_">__</span>(<span class="string">&#x27;title.tag&#x27;</span>) + page_title_suffix &#125;&#125;</span><br></pre></td></tr></table></figure><p>位置下添加代码：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&#123;% elif page.<span class="property">type</span> === <span class="string">&#x27;links&#x27;</span> and not page.<span class="property">title</span> %&#125;</span><br><span class="line">  &#123;&#123; <span class="title function_">__</span>(<span class="string">&#x27;title.links&#x27;</span>) + page_title_suffix &#125;&#125;</span><br></pre></td></tr></table></figure><h2 id="引入linksswig"><a class="markdownIt-Anchor" href="#引入linksswig"></a> 引入links.swig</h2><p>接着在<code>/themes/next/layout/page.swig</code>中，引入刚才新建的<code>page.swig</code>:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&#123;% elif page.<span class="property">type</span> === <span class="string">&#x27;links&#x27;</span> %&#125;</span><br><span class="line">    &#123;% include <span class="string">&#x27;links.swig&#x27;</span> %&#125;</span><br></pre></td></tr></table></figure><p>比如我是在</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% elif page.<span class="property">type</span> === <span class="string">&#x27;categories&#x27;</span> %&#125;</span><br></pre></td></tr></table></figure><p>这个<code>if</code>下追加的</p><h2 id="配置友链"><a class="markdownIt-Anchor" href="#配置友链"></a> 配置友链</h2><p>接下来，在<code>/themes/next/_config.yml</code>文件中配置友链，末尾处新增<code>mylinks</code>,如下：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">mylinks</span>:</span><br><span class="line">   - <span class="attr">nickname</span>: <span class="string">&quot;Xhofe&#x27;s Blog&quot;</span></span><br><span class="line">     <span class="attr">avatar</span>: <span class="attr">https</span>:<span class="comment">//blog.xhofe.top/images/avatar.jpg</span></span><br><span class="line">     <span class="attr">site</span>: <span class="attr">https</span>:<span class="comment">//blog.xhofe.top/</span></span><br><span class="line">     <span class="attr">info</span>: 在探索中前行，在失败中成长</span><br></pre></td></tr></table></figure><blockquote><p>这里是配置了一个友链，多个的配置方式相同。</p></blockquote><p>轻敲<code>hexo</code>命令三连，看看效果吧~?</p><blockquote><p>转自https://www.jianshu.com/p/ef110f36650b</p></blockquote>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;新增links页面&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#新增links页面&quot;&gt;&lt;/a&gt; 新增links页面&lt;/h2&gt;
&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;$ hexo new page links&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    <category term="tutorials" scheme="https://nn.ci/categories/tutorials/"/>
    
    
    <category term="hexo" scheme="https://nn.ci/tags/hexo/"/>
    
  </entry>
  
</feed>
