代码随想录算法训练营第八天 344. 反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串。

代码随想录算法训练营第八天| 344. 反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串。

344. 反转字符串

题目链接:力扣题目链接

文章讲解:代码随想录(programmercarl.com)

视频讲解:字符串基础操作! | LeetCode:344.反转字符串

状态:AC

思路

截屏2023-09-28 14.28.20

相同颜色的互换位置即可,即ilen(s) - 1 - i交换。i的范围到len(s)/2

代码

1
2
3
4
5
6
7
func reverseString(s []byte) {
for i := 0; i < len(s)/2; i++ {
temp := s[i]
s[i] = s[len(s)-i-1]
s[len(s)-i-1] = temp
}
}

541. 反转字符串II

题目链接:力扣题目链接

文章讲解:代码随想录(programmercarl.com)

视频讲解:字符串操作进阶! | LeetCode:541. 反转字符串II

状态:AC

思路

反转2(1)

  1. 如图,图中相同颜色的部分代表一个2k段,循环条件:for i := 0; i < len(s); i += 2 * k
  2. 相同颜色下,分为两段,前k段和后k段。前k段进行反转,后k段直接拼接。如果某一段到达了字符串s尾部,需要停止。
  3. 由于Go语言的字符串不可变,所以新建一个变量,一点点“组装”成最终结果。前k段翻转直接进行反向遍历。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
func min(a, b int) int {
if a < b {
return a
} else {
return b
}
}

func reverseStr(s string, k int) string {
newString := ""
for i := 0; i < len(s); i += 2 * k {
for j := min(len(s), i+k) - 1; j >= i; j-- { // 前k段
newString += string(s[j])
}
for j := i + k; j < min(len(s), i+2*k); j++ { // 后k段
newString += string(s[j])
}
}
return newString
}

剑指Offer 05.替换空格、LCR22.路径加密

题目链接:力扣题目链接

文章讲解:代码随想录(programmercarl.com)

状态:AC

思路

直接投机取巧,新建一个字符串newString,遍历字符串s,如果s[i] == '.',在newString += ' ',否则newString += s[i]

代码

1
2
3
4
5
6
7
8
9
10
11
func pathEncryption(path string) string {
newString := ""
for _, v:= range path{
if v == '.' {
newString += " "
} else {
newString += string(v)
}
}
return newString
}

151.翻转字符串里的单词

题目链接:力扣题目链接

文章讲解:代码随想录(programmercarl.com)

视频链接:字符串复杂操作拿捏了! | LeetCode:151.翻转字符串里的单词

状态:AC

思路

  1. 使用双指针,left指针指向的是单词的起始位置,遍历字符串用的i找到单词末尾。
  2. 新建一个字符串数组words,将每个单词加入到其中
  3. 定义新字符串newString,将words中每个单词拼接到newString中(反向遍历words),并且如果不是最后一个单词则再加一个空格。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
func reverseWords(s string) string {
words := []string{}
left := 0
for i := 0; i < len(s); i++ {
if s[i] == ' ' {
if s[left:i] != "" {
words = append(words, s[left:i])
}
left = i + 1
} else if i == len(s)-1 {
words = append(words, s[left:])
}
}
newString := ""
for i := len(words) - 1; i >= 0; i-- {
newString += words[i]
if i > 0 {
newString += " "
}
}
return newString
}

Offer58-II.左旋转字符串

题目链接:力扣题目链接

文章讲解:代码随想录(programmercarl.com)

状态:AC

思路

方法一

直接拼接

方法二

字符串移位

代码

1
2
3
4
// 方法一
func dynamicPassword(password string, target int) string {
return password[target:] + password[:target]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 方法二
func reverse(chars []byte, left, right int) {
for left < right {
temp := chars[left]
chars[left] = chars[right]
chars[right] = temp
left++
right--
}
}
func dynamicPassword(password string, target int) string {
chars := []byte(s)
reverse(chars, 0, target - 1)
reverse(chars, target, len(chars) - 1)
reverse(chars, 0, len(chars) - 1)
return string(chars)
}

代码随想录算法训练营第八天 344. 反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串。
https://promisewang.github.io/post/6416b651.html
作者
Promise
发布于
2023年9月28日
许可协议