代码随想录算法训练营第八天| 344.反转字符串、541. 反转字符串II、 剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串
前言
今天忙着写稿子开大会了,把博客提纲写好了,基础的反转已经没有问题了,但是后面几道题还需要明天上午独立敲一遍代码!!!
更新:字符串真的好烦 烦 kmp也烦 烦!!!
344.反转字符串
题目链接: 344.反转字符串
思路
没啥好说的,首尾双指针,互换指针值。
使用的时候就 reverseString(ss)
解题代码
func reverseString(s []byte) {
left := 0
right := len(s)-1
for left < right {
s[left], s[right] = s[right], s[left]
left++
right--
}
}
541. 反转字符串II
题目链接:541. 反转字符串II
思路
这道题的题意弄明白费了挺多时间,其实就是一个分组(每2k个字符为一组,reverse前k个)
解题代码
func reverseStr(s string, k int) string {
ss := []byte(s)
length := len(s)
for i := 0; i < length; i += 2 * k {
// 1. 每隔 2k 个字符的前 k 个字符进行反转
// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
if i + k <= length {
reverse(ss[i:i+k])
} else {
reverse(ss[i:length])
}
}
return string(ss)
}
func reverse(b []byte) {
left := 0
right := len(b) - 1
for left < right {
b[left], b[right] = b[right], b[left]
left++
right--
}
}
剑指Offer 05.替换空格
题目链接: 剑指Offer 05.替换空格
思路
- 根据空格数扩充数组;
- 从后往前替换空格,这要比从前往后更高效
解题代码
func replaceSpace(s string) string {
b := []byte(s)
length := len(b)
spaceCount := 0
// 计算空格数量
for _, v := range b {
if v == ' ' {
spaceCount++
}
}
// 扩展原有切片
resizeCount := spaceCount * 2
tmp := make([]byte, resizeCount)
b = append(b, tmp...)
i := length - 1
j := len(b) - 1
for i >= 0 {
if b[i] != ' ' {
b[j] = b[i]
i--
j--
} else {
b[j] = '0'
b[j-1] = '2'
b[j-2] = '%'
i--
j = j - 3
}
}
return string(b)
}
151.翻转字符串里的单词
题目链接: 151.翻转字符串里的单词
思路
写个提纲:
- 删去字符串的空格(保留单词见的一个空格,以便后续的操作)
1.1 快慢指针的使用 - 先整体翻转字符串
- 对每个单词进行反转
解题代码
func reverseWords(s string) string {
//1.使用双指针删除冗余的空格
slowIndex, fastIndex := 0, 0
b := []byte(s)
//删除头部冗余空格
for len(b) > 0 && fastIndex < len(b) && b[fastIndex] == ' ' {
fastIndex++
}
//删除单词间冗余空格
for ; fastIndex < len(b); fastIndex++ {
if fastIndex-1 > 0 && b[fastIndex-1] == b[fastIndex] && b[fastIndex] == ' ' {
continue
}
b[slowIndex] = b[fastIndex]
slowIndex++
}
//删除尾部冗余空格
if slowIndex-1 > 0 && b[slowIndex-1] == ' ' {
b = b[:slowIndex-1]
} else {
b = b[:slowIndex]
}
//2.反转整个字符串
reverse(&b, 0, len(b)-1)
//3.反转单个单词 i单词开始位置,j单词结束位置
i := 0
for i < len(b) {
j := i
for ; j < len(b) && b[j] != ' '; j++ {
}
reverse(&b, i, j-1)
i = j
i++
}
return string(b)
}
func reverse(b *[]byte, left, right int) {
for left < right {
(*b)[left], (*b)[right] = (*b)[right], (*b)[left]
left++
right--
}
}
剑指Offer58-II.左旋转字符串
题目链接:剑指Offer58-II.左旋转字符串
思路
这题主要的是一个思路:
- 反转前n个字符
- 反转第n到end字符
- 反转整个字符
解题代码
func reverseLeftWords(s string, n int) string {
b := []byte(s)
// 1. 反转前n个字符
// 2. 反转第n到end字符
// 3. 反转整个字符
reverse(b, 0, n-1)
reverse(b, n, len(b)-1)
reverse(b, 0, len(b)-1)
return string(b)
}
// 切片是引用传递
func reverse(b []byte, left, right int){
for left < right{
b[left], b[right] = b[right],b[left]
left++
right--
}
}