<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>算法 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E7%AE%97%E6%B3%95/</link><description>Recent content in 算法 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E7%AE%97%E6%B3%95/index.xml" rel="self" type="application/rss+xml"/><item><title>算法 面试题</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-questions/tag-6-af84cfb6/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-questions/tag-6-af84cfb6/</guid><description>&lt;p&gt;共 22 道 算法 面试题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-0c2e2466-54ef-47b7-99f1-1064ea325a0b"&gt;1. 不重复最大子串&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;难度：2 · 类型：QA&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;给定一个字符串，请实现一个函数来找到其中的不重复最大子串。例如，对于字符串&amp;quot;abcabcbb&amp;quot;，不重复最大子串是&amp;quot;abc&amp;quot;，长度为3。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;请写出实现该功能的代码，并说明其时间复杂度。&lt;/li&gt;
&lt;li&gt;考虑到性能优化，你认为还有哪些改进空间？请提出优化思路并实现优化后的代码。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;滑动窗口&lt;/strong&gt; 是解决最长不重复子串问题的核心思想。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Set 方法&lt;/strong&gt;简单直观，但每遇到重复字符可能多次移动左指针。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Map 优化&lt;/strong&gt;通过记录字符索引，&lt;strong&gt;直接跳过重复区域&lt;/strong&gt;，减少不必要操作。&lt;/li&gt;
&lt;li&gt;时间复杂度 O(n)，空间复杂度 O(Σ)。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一滑动窗口实现"&gt;一、滑动窗口实现&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;lengthOfLongestSubstring&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;set&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Set&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;left&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;maxLen&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;right&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;right&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;right&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;set&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;has&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;right&lt;/span&gt;])) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;set&lt;/span&gt;.&lt;span style="color:#66d9ef"&gt;delete&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;left&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;left&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;set&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;right&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;maxLen&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;maxLen&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;right&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;left&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;maxLen&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 测试
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;lengthOfLongestSubstring&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;abcabcbb&amp;#34;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// 输出 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="思路"&gt;思路&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;strong&gt;滑动窗口&lt;/strong&gt; &lt;code&gt;[left, right]&lt;/code&gt; 遍历字符串。&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;Set&lt;/code&gt; 存储当前窗口内字符。&lt;/li&gt;
&lt;li&gt;当遇到重复字符时，移动左指针，直到窗口内无重复字符。&lt;/li&gt;
&lt;li&gt;每次窗口扩大时更新最大长度。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="时间复杂度"&gt;时间复杂度&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;每个字符 &lt;strong&gt;最多进出窗口一次&lt;/strong&gt; → O(n)&lt;/li&gt;
&lt;li&gt;空间复杂度：O(min(n, Σ))，Σ 是字符集大小。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二性能优化"&gt;二、性能优化&lt;/h2&gt;
&lt;p&gt;上面方法每遇到重复字符，需要 &lt;strong&gt;逐个删除左边字符&lt;/strong&gt;。可以进一步优化为 &lt;strong&gt;直接跳过重复字符的索引&lt;/strong&gt;，使用 &lt;strong&gt;Map 存储字符上次出现的索引&lt;/strong&gt;。&lt;/p&gt;</description></item></channel></rss>