q6 N字形变换
题解
这道题一看就是一道模拟题,找到规律做的会比较快,我看到一位大佬比较简便的做法。做法是先开一个二维数组(字符串数组),然后把相同的一行存到二维数组中的同一行中,那怎么确定同一行的下标呢?
我们以一个V型的字符串个数为一个周期n,n就等于2 * numRows - 2, 那么这个周期中每个字符在二维数组中的下标就是min(i%n, n - i%n)。如下图所示:
最后用strings.Join函数将二维数组中的字符拼接为一个字符串。
func convert(s string, numRows int) string {
if numRows == 1 {
return s
}
// 二维数组。把Z型字符串同一行的字符存到同一行中
rows := make([]string, numRows)
// 计算V型字符串的周期
n := 2 * numRows - 2
for i, char := range s {
// 某个字符的下标应该是min(x, n - x)
x := i % n
rows[min(x, n - x)] += string(char)
}
// 最后将每一行的字符按顺序拼接为一个字符串
return strings.Join(rows, "")
}
func min(a, b int) int {
if a < b {
return a
} else {
return b
}
}
q14 最长公共前缀
题解
这题采用纵向比较法,首先把第一个字符串当作最长公共前缀与接下来的n-1个字符串去比较,在比较的过程中如果发现被比较的字符串已经到达末尾或者当前比较的两个字符不相等,就直接返回第一个字符串长度为i - 1的前缀。如果循环全部结束,就代表所有字符串相等,直接返回第一个字符串即可。
func longestCommonPrefix(strs []string) string {
if len(strs) == 0 {
return ""
}
for i := 0; i < len(strs[0]); i++ {
for j := 1; j < len(strs); j++ {
if i == len(strs[j]) || strs[j][i] != strs[0][i] {
return strs[0][:i]
}
}
}
return strs[0]
}
q763 划分字母区间
题解
这道题用hash表来做非常简单。首先将每个字符最后出现的位置存到hash表中,然后遍历字符串,用一个变量index储存该段字符串中的字符,出现最后一次的位置,最大的那个下标。同时一边遍历一边用index与当前循环变量做比较,如果相等,就表示这一段的所有字符在后面都没有出现过。那么当前这段的长度就是i - pre。
func partitionLabels(s string) []int {
hashTable := make(map[byte]int)
res := make([]int, 0)
for i, v := range s {
hashTable[byte(v)] = i
}
index := 0
pre := -1
for i, v := range s {
if index < hashTable[byte(v)] {
index = hashTable[byte(v)]
}
if i == index {
index = 0
res = append(res, i - pre)
pre = i
}
}
return res
}
剑指 Offer 05. 替换空格
题解
创建一个字节数组,然后遍历一遍字符串,将字符追加给字节数组即可。
func replaceSpace(s string) string {
var res []byte
for i := 0; i < len(s); i++ {
if s[i] == ' ' {
res = append(res, "%20"...)
} else {
res = append(res, s[i])
}
}
return string(res)
}
剑指 Offer 58 - I. 翻转单词顺序
题解
从给定的字符串尾部开始,一个单词一个单词的遍历,遍历到一个单词就累加到结果字符串里面。
func reverseWords(s string) (res string) {
i, j := len(s)-1, len(s)-1
for i >= 0 {
// 剔除右边的空格,找到单词的最后一个字母
for i >= 0 && s[i] == ' ' {
i--
}
j = i
for i >= 0 && s[i] != ' ' {
i--
}
res += s[i+1:j+1] + " "
}
return strings.TrimRight(res, " ")
}
剑指 Offer 58 - II. 左旋转字符串
题解
简单的字符串拼接,首先定义一个结果字符串str,然后先拼接给定字符串的后面部分:s[n:]
,接着拼接字符串的前面部分:s[:n]
。就完成了给定字符串的左旋。
func reverseLeftWords(s string, n int) (str string) {
str += s[n:]
str += s[:n]
return
}
func main() {
fmt.Println(reverseLeftWords("lrloseumgh", 6))
}