344.反转字符串
双指针
时间复杂度O(n) 空间复杂度O(1)
func reverseString(s []byte) {
// 双指针头尾遍历
left, right := 0, len(s)-1 // 双指针
for left < right{
s[left], s[right] = s[right], s[left] // 交换元素
left++
right--
}
}
541. 反转字符串II
双指针
使用双指针进行反转字符串,注意在Go中字符串是无法更改的
时间复杂度O(n) 空间复杂度O(n)
func reverseStr(s string, k int) string {
// 双指针,先定位,再反转
result := []byte(s)
left, right := 0, k-1
length := len(s)
for right < length {
for leftIndex, rightIndex := left, right; leftIndex < rightIndex; leftIndex, rightIndex = leftIndex+1, rightIndex-1 {
result[leftIndex], result[rightIndex] = result[rightIndex], result[leftIndex]
}
left = left + 2*k
right = right + 2*k
}
for leftIndex, rightIndex := left, length-1; leftIndex < rightIndex; leftIndex, rightIndex = leftIndex+1, rightIndex-1 {
result[leftIndex], result[rightIndex] = result[rightIndex], result[leftIndex]
}
return string(result)
}
替换数字
暴力
时间复杂度 O(n) 空间复杂度O(n)
package main
import "fmt"
func main() {
var str string
_, err := fmt.Scanf("%s", &str)
if err != nil {
return
}
result := ""
for i := 0; i < len(str); i++ {
if str[i] >= '0' && str[i] <= '9'{
result += "number"
}else{
result += string(str[i])
}
}
fmt.Println(result)
}
151.翻转字符串里的单词
双指针+两次反转
func reverseStr(s []byte, start int, end int) {
for start < end {
s[start], s[end] = s[end], s[start]
start++
end--
}
}
func reverseWords(s string) string {
// 法一:先去除空格,再反转数组
byteStr := make([]byte, 0)
lastCharIndex := len(s) - 1
for s[lastCharIndex] == ' ' {
lastCharIndex--
} // 获取最后一个字母的索引
needBlank := false
for index := 0; index <= lastCharIndex; index++ {
if s[index] != ' ' {
byteStr = append(byteStr, byte(s[index]))
needBlank = true
} else if needBlank {
byteStr = append(byteStr, ' ')
needBlank = false
}
}
reverseStr(byteStr, 0, len(byteStr)-1)
left, right := 0, 0
isEnd := false
for right < len(byteStr) {
for isEnd == false && byteStr[right] != ' ' {
right++
if right >= len(byteStr) {
isEnd = true
}
}
reverseStr(byteStr, left, right-1)
right += 1
left = right
}
return string(byteStr)
}
右旋字符串
多次反转
三次反转即可,一次整体反转,两次局部反转
时间复杂度O(n) 空间复杂度O(n)
package main
import "fmt"
func reverseStr(s []byte, left int , right int) {
for left < right {
s[left], s[right] = s[right], s[left]
left++
right--
}
}
func main() {
var k int
var s string
_, _ = fmt.Scanf("%d", &k)
_, _ = fmt.Scanf("%s", &s)
result := []byte(s)
reverseStr(result, 0, len(result)-1)
reverseStr(result, 0, k-1)
reverseStr(result, k, len(result)-1)
fmt.Println(string(result))
}