===问:

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。

示例 1:

输入: [“flower”,“flow”,“flight”]
输出: “fl”

示例 2:

输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。

说明:
所有输入只包含小写字母 a-z 。

===答:

方法一:
执行用时 :0 ms,击败了100.00% 的用户
内存消耗 :2.4 MB, 击败了27.91%的用户

以字符串长度最短的为参考源,依次比对找到不匹配的跳出,比较符合本人一般的思维模式

方法二:
执行用时 :0 ms, 击败了100.00% 的用户
内存消耗 :2.4 MB, 击败了89.71%的用户

任意一个元素都可以作为参考源,而不是方法一中必须使用字符串长度最短的那个作为参考源。
效率差不多,但是内存消耗似乎稍稍降低了一点点。

===解:

本题在算法层面没什么难度,就是按照一般的思路走就行了,方法二比方法一升级一点。

本题反倒让我在语言层面有所学习:
go语言中字符串默认情况下就是个[]uint8(别名:[]byte)的切片,因此可以直接用切片的方式对其进行切割,而输出的时候又是正常的字符串,例题如下。

如果使用默认方式,那么当遇到中文等字符的时候,就会占用三个位置,这时使用不当就可能出现乱码。那么为了防止出错,我们可以提前将字符串切片改为[]int32(别名[]rune)形式,输出时再利用string()变回字符串,例题如下。

[]uint8(别名[]byte)模式下获得的内容可以直接输出,比如fmt.Println(s[7:10])
[]int32(别名[]rune)模式下获得的内容输出后为int32类型的数值
使用for循环遍历字符串的时候,直接取值v的类型为int32(别名rune),通过索引i取值的类型为int32(别名rune)。在有中文情况下,i的值可能会有间隔

单引号包含的内容是字符,其值为int32(别名rune

上面说过切片可以直接输出,但前提是这个字符串已经存在,如果起始值是数值,或数值型切片,那就必须要使用string()来解析成字符串再输出。

参考文章:
《Golang学习日志 ━━ 一图一代码看懂range、byte、rune、uint8、int32》
《Go语言圣经-字节切片与字符串》