<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg><h1>
===答:</h1>
方法一:
执行用时 :500 ms, 击败了5.29% 的用户
内存消耗 :7.6 MB, 击败了25.00%的用户
<blockquote>
通过循环,生成只留下英文和数字的正向字符串<code>a</code>、反向字符串<code>b</code>
<code>a</code>和<code>b</code>进行比较是否一致
本方法执行效率极低~~
</blockquote>
<pre><code class="lang-go hljs"><span class="token keyword">func</span> <span class="token function">isPalindrome1</span><span class="token punctuation">(</span>s <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span>
l <span class="token operator">:=</span> <span class="token function">len</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span>
<span class="token keyword">if</span> l <span class="token operator"><</span> <span class="token number">1</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token boolean">true</span>
<span class="token punctuation">}</span>
s <span class="token operator">=</span> strings<span class="token punctuation">.</span><span class="token function">ToLower</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span>
a <span class="token operator">:=</span> <span class="token string">""</span>
b <span class="token operator">:=</span> <span class="token string">""</span>
<span class="token keyword">for</span> i <span class="token operator">:=</span> l<span class="token punctuation">;</span> i <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator">--</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">>=</span> <span class="token number">48</span> <span class="token operator">&&</span> s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><=</span> <span class="token number">57</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">>=</span> <span class="token number">97</span> <span class="token operator">&&</span> s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><=</span> <span class="token number">122</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
a <span class="token operator"> =</span> <span class="token function">string</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>s<span class="token punctuation">[</span>l<span class="token operator">-</span>i<span class="token punctuation">]</span> <span class="token operator">>=</span> <span class="token number">48</span> <span class="token operator">&&</span> s<span class="token punctuation">[</span>l<span class="token operator">-</span>i<span class="token punctuation">]</span> <span class="token operator"><=</span> <span class="token number">57</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span>s<span class="token punctuation">[</span>l<span class="token operator">-</span>i<span class="token punctuation">]</span> <span class="token operator">>=</span> <span class="token number">97</span> <span class="token operator">&&</span> s<span class="token punctuation">[</span>l<span class="token operator">-</span>i<span class="token punctuation">]</span> <span class="token operator"><=</span> <span class="token number">122</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
b <span class="token operator"> =</span> <span class="token function">string</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>l<span class="token operator">-</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> a <span class="token operator">==</span> b <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token boolean">true</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token boolean">false</span>
<span class="token punctuation">}</span>
</code></pre>
方法二:
执行用时 :248 ms, 击败了5.29% 的用户
内存消耗 :8.3 MB, 击败了16.67%的用户
<blockquote>
在方法一的基础上进化一下,遍历只留下英文和数字的逆向字符串<code>a</code>
原字符串<code>s</code>的字母和数字一一比对<code>a</code>,一旦出现不等就返回<code>false</code>
本方法内存占用比方法一增加,执行效率比方法一提升一倍
</blockquote>
<pre><code class="lang-go hljs"><span class="token keyword">func</span> <span class="token function">isPalindrome2</span><span class="token punctuation">(</span>s <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span>
l <span class="token operator">:=</span> <span class="token function">len</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span>
<span class="token keyword">if</span> l <span class="token operator"><</span> <span class="token number">1</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token boolean">true</span>
<span class="token punctuation">}</span>
s <span class="token operator">=</span> strings<span class="token punctuation">.</span><span class="token function">ToLower</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span>
a <span class="token operator">:=</span> <span class="token string">""</span>
<span class="token keyword">for</span> i <span class="token operator">:=</span> l<span class="token punctuation">;</span> i <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator">--</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">>=</span> <span class="token number">48</span> <span class="token operator">&&</span> s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><=</span> <span class="token number">57</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">>=</span> <span class="token number">97</span> <span class="token operator">&&</span> s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><=</span> <span class="token number">122</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
a <span class="token operator"> =</span> <span class="token function">string</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
j <span class="token operator">:=</span> <span class="token number">0</span>
<span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token keyword">range</span> s <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">>=</span> <span class="token number">48</span> <span class="token operator">&&</span> s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><=</span> <span class="token number">57</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">>=</span> <span class="token number">97</span> <span class="token operator">&&</span> s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><=</span> <span class="token number">122</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> a<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">!=</span> s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token punctuation">{</span>
fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> s<span class="token punctuation">,</span> <span class="token function">string</span><span class="token punctuation">(</span>a<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">string</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">return</span> <span class="token boolean">false</span>
<span class="token punctuation">}</span>
j<span class="token operator"> </span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token boolean">true</span>
<span class="token punctuation">}</span>
</code></pre>
方法三:
执行用时 :40 ms, 击败了10.10% 的用户
内存消耗 :8.5 MB, 击败了16.67%的用户
<blockquote>
在方法二的基础上再进化一下,利用正则表达式留下英文和数字的切片<code>t</code>
循环次数只使用该切片<code>t</code>长度的一半,依次前后进行比对,一旦出现不等就返回<code>false</code>
本方法内存占用比方法二增加,执行效率比方法二提升五倍
</blockquote>
<pre><code class="lang-go hljs"><span class="token keyword">func</span> <span class="token function">isPalindrome3</span><span class="token punctuation">(</span>s <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token function">len</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">2</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token boolean">true</span>
<span class="token punctuation">}</span>
s <span class="token operator">=</span> strings<span class="token punctuation">.</span><span class="token function">ToLower</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span>
re <span class="token operator">:=</span> regexp<span class="token punctuation">.</span><span class="token function">MustCompile</span><span class="token punctuation">(</span><span class="token string">"\\w"</span><span class="token punctuation">)</span>
t <span class="token operator">:=</span> re<span class="token punctuation">.</span><span class="token function">FindAll</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token function">byte</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>
l <span class="token operator">:=</span> <span class="token function">len</span><span class="token punctuation">(</span>t<span class="token punctuation">)</span>
<span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> l<span class="token operator">/</span><span class="token number">2</span><span class="token punctuation">;</span> i<span class="token operator"> </span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> t<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">!=</span> t<span class="token punctuation">[</span>l<span class="token operator">-</span><span class="token number">1</span><span class="token operator">-</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token boolean">false</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token boolean">true</span>
<span class="token punctuation">}</span>
</code></pre>
方法四:
执行用时 :32 ms/24 ms, 击败了10.74%/12.98% 的用户
内存消耗 :7.5 MB, 击败了25.00%的用户
<blockquote>
方法三的基础上进一步简化,去掉了不必要的变量
本方法内存占用比方法三降低,执行效率比方法三提升一倍
</blockquote>
<pre><code class="lang-go hljs"><span class="token keyword">func</span> <span class="token function">isPalindrome4</span><span class="token punctuation">(</span>s <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span>
t <span class="token operator">:=</span> regexp<span class="token punctuation">.</span><span class="token function">MustCompile</span><span class="token punctuation">(</span><span class="token string">"\\w"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">FindAllString</span><span class="token punctuation">(</span>strings<span class="token punctuation">.</span><span class="token function">ToLower</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>
<span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token function">len</span><span class="token punctuation">(</span>t<span class="token punctuation">)</span><span class="token operator">/</span><span class="token number">2</span><span class="token punctuation">;</span> i<span class="token operator"> </span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> t<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">!=</span> t<span class="token punctuation">[</span><span class="token function">len</span><span class="token punctuation">(</span>t<span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span><span class="token operator">-</span>i<span class="token punctuation">]</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token boolean">false</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token boolean">true</span>
<span class="token punctuation">}</span>
</code></pre>
方法五:
执行用时 :0 ms/4 ms, 击败了100.00%/68.11% 的用户
内存消耗 :2.7 MB, 击败了91.67%/75.00% 的用户
<blockquote>
前面四种方法的执行情况和排名实在无法令人满意,因此本方法使用了双指针法。
遍历时双指针<code>i</code>和<code>j</code>分别从字符串前后移动,并通过unicode的方法来判断当前字符是否为数字或字母,
如果不是数字和字母,则其对应的指针<code>i</code>或<code>j</code>移动<code>1</code>并进入下一次循环。
如果数字和字母都符合要求,但值不相同,则返回<code>false</code>
本方法内存占用比方法四降低近2倍,执行效率比方法四提升五倍以上
</blockquote>
<pre><code class="lang-go hljs"><span class="token keyword">func</span> <span class="token function">isPalindrome5</span><span class="token punctuation">(</span>s <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token function">len</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">2</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token boolean">true</span>
<span class="token punctuation">}</span>
i<span class="token punctuation">,</span> j <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token function">len</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span>
<span class="token keyword">for</span> i <span class="token operator"><</span> j <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token operator">!</span>unicode<span class="token punctuation">.</span><span class="token function">IsDigit</span><span class="token punctuation">(</span><span class="token function">rune</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token operator">!</span>unicode<span class="token punctuation">.</span><span class="token function">IsLetter</span><span class="token punctuation">(</span><span class="token function">rune</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
i<span class="token operator"> </span>
<span class="token keyword">continue</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token operator">!</span>unicode<span class="token punctuation">.</span><span class="token function">IsDigit</span><span class="token punctuation">(</span><span class="token function">rune</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token operator">!</span>unicode<span class="token punctuation">.</span><span class="token function">IsLetter</span><span class="token punctuation">(</span><span class="token function">rune</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
j<span class="token operator">--</span>
<span class="token keyword">continue</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> unicode<span class="token punctuation">.</span><span class="token function">ToLower</span><span class="token punctuation">(</span><span class="token function">rune</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">!=</span> unicode<span class="token punctuation">.</span><span class="token function">ToLower</span><span class="token punctuation">(</span><span class="token function">rune</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token boolean">false</span>
<span class="token punctuation">}</span>
i<span class="token operator"> </span>
j<span class="token operator">--</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token boolean">true</span>
<span class="token punctuation">}</span>
</code></pre>
<h1>