教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Golang面试考题记录 ━━ 验证回文串,多种方法涉及双指针、strings、unicode和regexp

Golang面试考题记录 ━━ 验证回文串,多种方法涉及双指针、strings、unicode和regexp

发布时间:2021-12-02   编辑:jiaochengji.com
教程集为您提供Golang面试考题记录 ━━ 验证回文串,多种方法涉及双指针、strings、unicode和regexp等资源,欢迎您收藏本站,我们将为您提供最新的Golang面试考题记录 ━━ 验证回文串,多种方法涉及双指针、strings、unicode和regexp资源
<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>

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
**说明:**本题中,我们将空字符串定义为有效的回文串。

示例 1:

<blockquote>

输入: “A man, a plan, a canal: Panama”
输出: true

</blockquote>

示例 2:

<blockquote>

输入: “race a car”
输出: false

</blockquote> <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>
===解:</h1> <h3>什么是回文串?</h3>

“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。

参考:《回文串》

<h3>
字符串 strings.</h3>

方法一、二、三、四中使用<code>strings.ToLower()</code>来将字符串字母改为小写

其余的包含、替换、拼接、分割等等方法请
参考:《golang标准库-strings》

<h3>
正则 regexp.</h3>

方法中使用正则过滤了字符串,只留英文和数字
<code>[a-zA-Z0-9]</code>遗漏 ´,所以方法中使用了<code>\\w</code>

参考:《golang正则使用总结》

<h3>
unicode.</h3>

方法五中利用<code>unicode</code>的方法来判断字符是否为英文或数字,强制转换小写,执行效率非常高,加入了这么多的条件语句,竟然执行效率没有降低。

注意:使用时需要利用<code>rune()</code>来强制转换类型为<code>rune</code>,即<code>int32</code>

参考:《Golang学习 - unicode 包》

<h3>
rune</h3>

关于几个类型的关系可以参考我之前写的日志。

参考:《Golang学习日志 ━━ 一图一代码看懂range、byte、rune、uint8、int32》

到此这篇关于“Golang面试考题记录 ━━ 验证回文串,多种方法涉及双指针、strings、unicode和regexp”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Golang面试考题记录 ━━ 验证回文串,多种方法涉及双指针、strings、unicode和regexp
Go语言基础(一)
Go 中文和unicode字符之间转换
Golang错误和异常处理的正确姿势
Golang学习日志 ━━ Go 常用包整理及介绍
拓展学习-golang的基础语法和常用开发工具
使用Go语言一段时间的感受
Golang内存分配实现分析
常用正则表达式全集
学习单元测试,告别祈祷式编程

[关闭]
~ ~