今日任务
● 344.反转字符串
● 541. 反转字符串II
● 卡码网:54.替换数字
● 151.翻转字符串里的单词
● 卡码网:55.右旋转字符串
1. 反转字符串
关联 leetcode 454.四数相加II
-
题解
- 双指针实现
func reverseString(s []byte) { head := 0 tail := len(s) - 1 for head < tail { s[head], s[tail] = s[tail], s[head] head++ tail-- } }
2. 反转字符串II
关联 leetcode 541. 反转字符串II
-
Go截至1.21 版本没有内置reverse() 库函数
-
思路
- 每次运动固定 2k 个步长
- 如果当前仍在数组内
- 翻转前k个元素
- 翻转最后几个元素
- 如果当前仍在数组内
- 每次运动固定 2k 个步长
-
题解
func reverseStr(s string, k int) string { res := []byte(s) //每次走2k个步长,反转前k个元素 for i := 0; i < len(s); i += 2 * k { if i+k <= len(s) { reverse(res[i : i+k]) } else { reverse(res[i:]) } } return string(res) } func reverse(s []byte) { head := 0 tail := len(s) - 1 for head < tail { s[head], s[tail] = s[tail], s[head] head++ tail-- } }
3. 替换数字
关联 卡码网:54.替换数字
-
题解
- 直接用golang的数组合并特性
package main import ( "fmt" ) func main() { var strByte []byte fmt.Scanln(&strByte) for i := 0; i < len(strByte); i++ { // 遇到数字 if strByte[i] >= '0' && strByte[i] <= '9' { // 要替换的数组 insertElement := []byte{'n', 'u', 'm', 'b', 'e', 'r'} // 后续需要移动的指针步长 moveLen := len(insertElement) // 更新数组 insertElement = append(insertElement, strByte[i+1:]...) strByte = append(strByte[:i], insertElement...) // 更新数组后移动指针 i = i + moveLen - 1 } } fmt.Println(string(strByte)) }
4. 翻转字符串里的单词
关联 leetcode 151.翻转字符串里的单词
- 题解
-
声明额外数组
func reverseWords(s string) string { srcSlice := strings.Split(strings.TrimSpace(s), " ") dstSlice := make([]string, 0) for i := range srcSlice { if strings.TrimSpace(srcSlice[i]) != "" { dstSlice = append(dstSlice, srcSlice[i]) } } slices.Reverse(dstSlice) s = "" for i := range dstSlice { if i <= len(dstSlice)-2 { s += dstSlice[i] + " " } else { s += dstSlice[i] } } return s }
-
原地反转
-
去除多于空格
- 头部的空格、尾部的空格、单词间冗余的空格
-
翻转
- 反转所有字符
- [I am a cat] —> [tac a ma I]
- 再翻转单词
- [cat a am I] :完成字符串翻转
- 反转所有字符
-
题解
func reverseWords(s string) string { b := []byte(s) // 移除多余空格 slow := 0 for i := 0; i < len(b); i++ { if b[i] != ' ' { if slow != 0 { b[slow] = ' ' slow++ } for i < len(b) && b[i] != ' ' { b[slow] = b[i] slow++ i++ } } } b = b[0:slow] //翻转整个字符串 reverse(b) //翻转每个单词 last := 0 for i := 0; i <= len(b); i++ { if i == len(b) || b[i] == ' ' { reverse(b[last:i]) last = i + 1 } } return string(b) } // 翻转字符串 func reverse(b []byte) { left := 0 right := len(b) - 1 for left < right { b[left], b[right] = b[right], b[left] left++ right-- } }
-
-
5. 右旋转字符串
关联 卡码网:55.右旋转字符串
-
思路
- 先用 带旋转的 长度,分割字符串
- 整体翻转原字符串
- 再根据开始的切割翻转每一段字符串
-
题解
package main import "fmt" func reverse(s []byte) { l, r := 0, len(s)-1 for l < r { s[l], s[r] = s[r], s[l] l++ r-- } } func main() { var str string var target int fmt.Scanln(&target) fmt.Scanln(&str) strBytes := []byte(str) reverse(strBytes) reverse(strBytes[0:target]) reverse(strBytes[target:]) fmt.Println(string(strBytes)) }