Golang面试考题记录 ━━ 最长公共前缀,字符串就是切片,复习[]byte、[]rune、[]uint8、[]int32和单引号
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
<blockquote>输入: [“flower”,“flow”,“flight”]
输出: “fl”
示例 2:
<blockquote>输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
方法一:
执行用时 :0 ms,击败了100.00% 的用户
内存消耗 :2.4 MB, 击败了27.91%的用户
以字符串长度最短的为参考源,依次比对找到不匹配的跳出,比较符合本人一般的思维模式
</blockquote> <pre><code class="lang-go hljs"><span class="token keyword">func</span> <span class="token function">longestCommonPrefix1</span><span class="token punctuation">(</span>strs <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token builtin">string</span> <span class="token punctuation">{</span> s <span class="token operator">:=</span> <span class="token string">""</span> l <span class="token operator">:=</span> <span class="token number">0</span> j <span class="token operator">:=</span> <span class="token number">0</span> n <span class="token operator">:=</span> <span class="token number">0</span> m <span class="token operator">:=</span> <span class="token function">len</span><span class="token punctuation">(</span>strs<span class="token punctuation">)</span> <span class="token keyword">switch</span> m <span class="token punctuation">{</span> <span class="token keyword">case</span> <span class="token number">0</span><span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token string">""</span> <span class="token keyword">case</span> <span class="token number">1</span><span class="token punctuation">:</span> <span class="token keyword">return</span> strs<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token comment">// 找到字符最少的字符串</span> <span class="token keyword">for</span> i<span class="token punctuation">,</span> v <span class="token operator">:=</span> <span class="token keyword">range</span> strs <span class="token punctuation">{</span> <span class="token comment">// 如果有一个字符串为空,则跳出</span> <span class="token keyword">if</span> <span class="token function">len</span><span class="token punctuation">(</span>v<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token string">""</span> <span class="token punctuation">}</span> <span class="token comment">// 选择最小字符数的</span> <span class="token keyword">if</span> <span class="token function">len</span><span class="token punctuation">(</span>v<span class="token punctuation">)</span> <span class="token operator"><</span> l <span class="token operator">||</span> l <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">{</span> l <span class="token operator">=</span> <span class="token function">len</span><span class="token punctuation">(</span>v<span class="token punctuation">)</span> j <span class="token operator">=</span> i <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// 以字符最少的字符串进行循环</span> <span class="token keyword">for</span> i<span class="token punctuation">,</span> v <span class="token operator">:=</span> <span class="token keyword">range</span> strs<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token punctuation">{</span> <span class="token comment">// 遍历所有字符串</span> <span class="token keyword">for</span> <span class="token boolean">_</span><span class="token punctuation">,</span> y <span class="token operator">:=</span> <span class="token keyword">range</span> strs <span class="token punctuation">{</span> <span class="token comment">//如果字符相同,则 1</span> <span class="token keyword">if</span> <span class="token function">string</span><span class="token punctuation">(</span>v<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token function">string</span><span class="token punctuation">(</span>y<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> n<span class="token operator"> </span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// 如果n的数量和strs的长度相同,则表示都存在该字符,继续循环,否则跳出并返回s</span> <span class="token keyword">if</span> n <span class="token operator">==</span> <span class="token function">len</span><span class="token punctuation">(</span>strs<span class="token punctuation">)</span> <span class="token punctuation">{</span> s <span class="token operator"> =</span> <span class="token function">string</span><span class="token punctuation">(</span>v<span class="token punctuation">)</span> n <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> s <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> s <span class="token punctuation">}</span> </code></pre>方法二:
执行用时 :0 ms, 击败了100.00% 的用户
内存消耗 :2.4 MB, 击败了89.71%的用户
任意一个元素都可以作为参考源,而不是方法一中必须使用字符串长度最短的那个作为参考源。
效率差不多,但是内存消耗似乎稍稍降低了一点点。
本题在算法层面没什么难度,就是按照一般的思路走就行了,方法二比方法一升级一点。
本题反倒让我在语言层面有所学习:
go语言中字符串默认情况下就是个<code>[]uint8</code>(别名:<code>[]byte</code>)的切片,因此可以直接用切片的方式对其进行切割,而输出的时候又是正常的字符串,例题如下。
如果使用默认方式,那么当遇到中文等字符的时候,就会占用三个位置,这时使用不当就可能出现乱码。那么为了防止出错,我们可以提前将字符串切片改为<code>[]int32</code>(别名<code>[]rune</code>)形式,输出时再利用<code>string()</code>变回字符串,例题如下。
<pre><code class="lang-go hljs">t <span class="token operator">:=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token function">int32</span><span class="token punctuation">(</span><span class="token string">"a测,123试"</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token function">string</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// 英文占一位</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token function">string</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// 中文占1位</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token function">string</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// 中文符号占1位</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">:</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token function">string</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">:</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//数字占1位</span> <span class="token comment">// 97 a</span> <span class="token comment">// 27979 测</span> <span class="token comment">// 65292 ,</span> <span class="token comment">// [49 50 51] 123</span> </code></pre><code>[]uint8</code>(别名<code>[]byte</code>)模式下获得的内容可以直接输出,比如<code>fmt.Println(s[7:10])</code>
<code>[]int32</code>(别名<code>[]rune</code>)模式下获得的内容输出后为<code>int32</code>类型的数值
使用for循环遍历字符串的时候,直接取值<code>v</code>的类型为<code>int32</code>(别名<code>rune</code>),通过索引<code>i</code>取值的类型为<code>int32</code>(别名<code>rune</code>)。在有中文情况下,<code>i</code>的值可能会有间隔
单引号包含的内容是字符,其值为<code>int32</code>(别名<code>rune</code>)
<pre><code class="lang-go hljs">fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"类型:%T,值:%v\n"</span><span class="token punctuation">,</span> <span class="token string">'a'</span><span class="token punctuation">,</span> <span class="token string">'a'</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"类型:%T,值:%v\n"</span><span class="token punctuation">,</span> <span class="token string">'测'</span><span class="token punctuation">,</span> <span class="token string">'测'</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"类型:%T,值:%v\n"</span><span class="token punctuation">,</span> <span class="token string">','</span><span class="token punctuation">,</span> <span class="token string">','</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"类型:%T,值:%v\n"</span><span class="token punctuation">,</span> <span class="token string">'1'</span><span class="token punctuation">,</span> <span class="token string">'1'</span><span class="token punctuation">)</span> <span class="token comment">// 类型:int32,值:97</span> <span class="token comment">// 类型:int32,值:27979</span> <span class="token comment">// 类型:int32,值:65292</span> <span class="token comment">// 类型:int32,值:49</span> </code></pre>上面说过切片可以直接输出,但前提是这个字符串已经存在,如果起始值是数值,或数值型切片,那就必须要使用<code>string()</code>来解析成字符串再输出。
<pre><code class="lang-go hljs"><span class="token comment">// 整数</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">int32</span><span class="token punctuation">(</span><span class="token number">27979</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//输出:27979</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token number">27979</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//输出:测</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token function">int32</span><span class="token punctuation">(</span><span class="token number">27979</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//输出:测</span> <span class="token comment">// 切片</span> u <span class="token operator">:=</span> <span class="token string">"测"</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>u<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">:</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment">//输出:测</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int32</span><span class="token punctuation">{</span><span class="token number">27979</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token comment">//输出:[27979]</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int32</span><span class="token punctuation">{</span><span class="token number">27979</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//输出:测</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int32</span><span class="token punctuation">{</span><span class="token number">27979</span><span class="token punctuation">,</span> <span class="token number">27979</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//输出:测测</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">uint8</span><span class="token punctuation">{</span><span class="token number">230</span><span class="token punctuation">,</span> <span class="token number">181</span><span class="token punctuation">,</span> <span class="token number">139</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//输出:测</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">uint8</span><span class="token punctuation">{</span><span class="token number">230</span><span class="token punctuation">,</span> <span class="token number">181</span><span class="token punctuation">,</span> <span class="token number">139</span><span class="token punctuation">,</span> <span class="token number">230</span><span class="token punctuation">,</span> <span class="token number">181</span><span class="token punctuation">,</span> <span class="token number">139</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//输出:测测</span> <span class="token comment">// 整数</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">uint8</span><span class="token punctuation">(</span><span class="token number">97</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//输出:97</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token number">97</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//输出:a</span> <span class="token comment">// 切片</span> u <span class="token operator">=</span> <span class="token string">"a"</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>u<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">:</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment">//输出:a</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">uint8</span><span class="token punctuation">{</span><span class="token number">97</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//输出:a</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">uint8</span><span class="token punctuation">{</span><span class="token number">97</span><span class="token punctuation">,</span> <span class="token number">97</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//输出:aa</span> <span class="token comment">// 27979</span> <span class="token comment">// 测</span> <span class="token comment">// 测</span> <span class="token comment">// 测</span> <span class="token comment">// [27979]</span> <span class="token comment">// 测</span> <span class="token comment">// 测测</span> <span class="token comment">// 测</span> <span class="token comment">// 测测</span> <span class="token comment">// 97</span> <span class="token comment">// a</span> <span class="token comment">// a</span> <span class="token comment">// a</span> <span class="token comment">// aa</span> </code></pre>参考文章:
《Golang学习日志 ━━ 一图一代码看懂range、byte、rune、uint8、int32》
《Go语言圣经-字节切片与字符串》
您可能感兴趣的文章:
Golang面试考题记录 ━━ 最长公共前缀,字符串就是切片,复习[]byte、[]rune、[]uint8、[]int32和单引号
【GoLang】golang底层数据类型实现原理
golang把数字变字符串_golang高频面试题:翻转含有中文、数字、英文字母的字符串...
Go语言基础(一)
Golang标准库——encoding(2)
Golang基础 (字符型[byte和rune])
2.GO语言之基本数据类型,运算符
第02章 Go语言基本语法
理解 Go 语言中的字符串和字节数组
Go语言学习之懒人速成 - 基础篇