LeetCode 344.反转字符串
题目链接:344.反转字符串
题目讲解:代码随想录
题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组
s
的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
func reverseString(s []byte) {
l := 0
r := len(s) - 1
for l < r{
s[l], s[r] = s[r], s[l]
l++
r--
}
}
LeetCode 541. 反转字符串II
题目链接:541. 反转字符串II
题目讲解:代码随想录
题目描述:给定一个字符串
s
和一个整数k
,从字符串开头算起,每计数至2k
个字符,就反转这2k
字符中的前k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。- 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
遍历时,让i每次跳2*k个位置:
如果i + k <= length,说明剩余字符大于或等于 k
个,则反转前 k
个字符。
如果i + k > length,说明剩余字符少于 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){
l := 0
r := len(b) - 1
for l < r{
b[l], b[r] = b[r], b[l]
l++
r--
}
}
KamaCoder 54.替换数字
题目链接:54.替换数字
题目讲解:代码随想录
题目描述:给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
如果想把这道题目做到极致,就不要只用额外的辅助空间了。使用双指针。
具体思路为:
- 首先查看字符串中有多少个数字字符。
- 根据数字字符的个数,扩充原来的字符数组。
- 使用双指针,leftP指向原来字符串的最后端,rightP指向扩充后字符数组的最后端。
- 使用leftP遍历,如果遇到数字字符,则把"number"字符串从rigthP - len("number") + 1的位置往后依次填充。然后,更新rightP位置,向前移动len("number")个位置。leftP向前移动一位。
- 如果没有遇到数字字符,则把leftP指向的数组元素替换到rightP的位置上。rightP和leftP的位置都向前移动一位。
package main
import (
"fmt"
"os"
"bufio"
)
func replaceNumber(strByte []byte) string {
// 查看有多少字符
numCount, oldSize := 0, len(strByte)
for i := 0; i < len(strByte); i++{
if (strByte[i] <= '9' && strByte[i] >= '0'){
numCount++
}
}
// 增加长度
for i := 0; i < numCount; i++{
strByte = append(strByte, []byte(" ")...)
}
tmpBytes := []byte("number")
// 双指针从后遍历
leftP, rightP := oldSize-1, len(strByte) - 1
for leftP < rightP{
rightShift := 1
// 如果是数字则加入number
if(strByte[leftP] <= '9'&& strByte[leftP] >= '0'){
for i, tmpByte := range tmpBytes{
strByte[rightP - len(tmpBytes) + i + 1] = tmpByte
}
rightShift = len(tmpBytes)
}else{
strByte[rightP] = strByte[leftP]
}
//更新指针
rightP -= rightShift
leftP -= 1
}
return string(strByte)
}
func main(){
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
input := scanner.Text()
newString := replaceNumber([]byte(input))
fmt.Println(newString)
}