ch4/ch4-02 #160
Replies: 27 comments 3 replies
-
4.3
|
Beta Was this translation helpful? Give feedback.
-
4.4
|
Beta Was this translation helpful? Give feedback.
-
4.3
|
Beta Was this translation helpful? Give feedback.
-
4.5
|
Beta Was this translation helpful? Give feedback.
-
4.6
|
Beta Was this translation helpful? Give feedback.
-
4.7
|
Beta Was this translation helpful? Give feedback.
-
4.7没想明白 // 4.6
func replaceAdjacentSpaces(slice []byte) []byte {
length := len(slice)
result := make([]byte, 0, length)
for i := 0; i < length; {
r, size := utf8.DecodeRune(slice[i:])
if unicode.IsSpace(r) {
// 如果当前字符是空格
result = append(result, ' ') // 将一个空格添加到结果切片
for i+size < length {
nextRune, nextSize := utf8.DecodeRune(slice[i+size:])
if !unicode.IsSpace(nextRune) {
break // 直到找到下一个非空格字符
}
size += nextSize // 继续增加字符大小
}
} else {
// 如果当前字符不是空格
result = append(result, slice[i:i+size]...)
}
i += size
}
return result
}
// 4.4 旋转
func rotate(str []string, k int) {
if str == nil {
return
}
reverse(str[:k])
reverse(str[k:])
reverse(str)
}
func reverse(s []string) {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
}
// 4.5 去除重复的值
func removeDuplication(str []string) {
if str == nil {
return
}
si := 0
for i := 0; i < len(str); i++ {
if i != 0 && str[i] == str[i-1] {
continue
}
str[si] = str[i]
si++
}
// si最终结果是len长度
str = str[:si]
}
// int类型slice反转
func reverseSlice(s []int) {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
}
// 4.3 数组反转
func reverseArray(s *[5]int) {
if s == nil {
return
}
for left, right := 0, len(s)-1; left < right; left, right = left+1, right-1 {
s[left], s[right] = s[right], s[left]
}
} |
Beta Was this translation helpful? Give feedback.
-
// 4.4
func rotate(slice []int, k int) []int {
var sliceLen int = len(slice)
if sliceLen == 0 {
return nil
}
k = k % sliceLen
reverse(slice[:k])
reverse(slice[k:])
reverse(slice)
return slice
}
// 4.5
func eraseSame(slice []string) []string {
var idx = 0
var lastStr string
for i, str := range slice {
if i == 0 {
idx++
lastStr = str
continue
}
if str == lastStr {
continue
}
slice[idx] = str
idx++
lastStr = str
}
return slice[:idx]
}
// 4.6
func eraseMultiSpace(slice []byte) []byte {
var write = 0
var isPreSpace = false
var idx int = 0
for idx < len(slice) {
ch, size := utf8.DecodeRune(slice[idx:])
if unicode.IsSpace(ch) && isPreSpace {
idx += size
continue
}
isPreSpace = unicode.IsSpace(ch)
copy(slice[write:], slice[idx:idx+size])
idx += size
write += size
}
return slice[:write]
}
// 4.7
func reverseBytes(slice []byte) []byte {
var idx = 0
for idx < len(slice) {
_, size := utf8.DecodeRune(slice[idx:])
for i, j := idx, idx+size-1; i < j; i, j = i+1, j-1 {
slice[i], slice[j] = slice[j], slice[i]
}
idx += size
}
for i, j := 0, len(slice)-1; i < j; i, j = i+1, j-1 {
slice[i], slice[j] = slice[j], slice[i]
}
return slice
} |
Beta Was this translation helpful? Give feedback.
-
4.7
实现:
|
Beta Was this translation helpful? Give feedback.
-
package main
import (
"fmt"
"unicode"
)
func reverse(s *[6]int) {
l := len(s) - 1
for i := 0; 2*i <= l; i += 1 {
s[i], s[l-i] = s[l-i], s[i]
}
}
// assume left rotated
func rotate(s []int, n int) {
// planA
// stack := s[n:]
// stack = append(stack, s[:n]...)
// return stack
// planB
for i := n; i < len(s); i++ {
s[i-n], s[i] = s[i], s[i-n]
}
}
func unique(str []string) {
if len(str) == 0 {
return
}
flag := str[0]
for i := 1; i < len(str); i++ {
if str[i] != flag {
flag = str[i]
} else {
str[i] = ""
}
}
}
func singleSpace(s []byte) []byte {
count := -1
i := 0
for ;i < len(s); i++ {
if unicode.IsSpace(rune(s[i])) {
count++
} else {
if count > 0 {
move := s[i:]
copy(s[i-count:], move)
s = s[:len(s) - count]
i = i - count
}
count = -1
}
}
return s
}
func main() {
a := [6]int{4, 2, 9, 6, 1, 7}
b := []int{4, 2, 9, 6, 1, 7}
c := []string{"aa", "cc", "cc", "aa", "dd", "ee", "ee", "ee"}
d := []byte(" a b c d ee ")
// 4.3
reverse(&a)
fmt.Println(a)
// 4.4
// fmt.Println(rotate(b, 2))
rotate(b, 2)
fmt.Println(b)
// 4.5
unique(c)
fmt.Println(c)
// 4.6
d = singleSpace(d)
fmt.Println(string(d))
// 4.7 can't understand
} |
Beta Was this translation helpful? Give feedback.
-
// 4.6
func replaceAdjacentSpaces2(data []byte) []byte {
var (
write int
spaced bool
r rune
size int
)
for read := 0; read < len(data); read += size {
r, size = utf8.DecodeRune(data[read:])
if unicode.IsSpace(r) {
if !spaced {
data[write] = ' '
write++
spaced = true
}
} else {
write += utf8.EncodeRune(data[write:], r)
spaced = false
}
}
return data[:write]
} |
Beta Was this translation helpful? Give feedback.
-
// 4.6
func removeDupSpace(slides []byte) []byte {
i, j := 0, 0
for j < len(slides) {
slides[i] = slides[j]
if !unicode.IsSpace(rune(slides[i])) {
i++
j++
continue
}
i++
for j < len(slides) && unicode.IsSpace(rune(slides[j])) {
j++
}
}
return slides[:i]
} |
Beta Was this translation helpful? Give feedback.
-
// 4.7
func reverseStrBytes(str []byte) []byte {
idx := 0
for idx < len(str) {
_, size := utf8.DecodeRune(str[idx:])
reverseBytes(str[idx : idx+size])
idx += size
}
reverseBytes(str)
return str
}
func reverseBytes(slide []byte) {
for i, j := 0, len(slide)-1; i < j; i, j = i+1, j-1 {
slide[i], slide[j] = slide[j], slide[i]
}
} |
Beta Was this translation helpful? Give feedback.
-
func ReversebyPtr(ptr *[]int) {
slice := *ptr
for i, j := 0, len(slice)-1; i < j; i, j = i+1, j-1 {
slice[i], slice[j] = slice[j], slice[i]
}
} |
Beta Was this translation helpful? Give feedback.
-
练习 4.6: 编写一个函数,原地将一个UTF-8编码的[]byte类型的slice中相邻的空格(参考unicode.IsSpace)替换成一个空格返回 func TestClearSpace(t *testing.T) {
fmt.Println(string(clearSpace([]byte(" 1 2 \n\t 3 4 56 7 "))))
}
// clearSpace 无拷贝(注意尾部多个空格的话也需要保留一个)
func clearSpace(arr []byte) []byte {
j := 0
for i := 1; i < len(arr); i++ {
if isSpace(arr[i]) && isSpace(arr[j]) {
continue
}
j++
arr[j] = arr[i]
}
return arr[:j+1]
}
// isSpace 参考 unicode.IsSpace
func isSpace(testByte byte) bool {
for _, spaceByte := range []byte{'\t', '\n', '\v', '\f', '\r', ' ', 0x85, 0xA0} {
if testByte == spaceByte {
return true
}
}
return false
} |
Beta Was this translation helpful? Give feedback.
-
4.4 一次遍历完成旋转 func test2[T any](slice []T, index int) []T {
slice = append(slice, slice[:index]...)
slice = slice[index:]
return slice
} 4.5 消除相邻相等元素 func test3(slice []string) []string {
if len(slice) == 0 || len(slice) == 1 {
return slice
}
count := 0
for i := 1; i < len(slice); i++ {
if slice[i] != slice[i-1] {
count++
slice[count] = slice[i]
}
}
return slice[:count+1]
} |
Beta Was this translation helpful? Give feedback.
-
Exercise 4.5 func removeAdjacentDuplicates(s []string) []string {
// edge case
if len(s) <= 1 {
return s
}
i := 1
curr := s[0]
for j := 1; j < len(s); j++ {
if s[j] != curr {
s[i] = s[j]
i++
curr = s[j]
}
}
return s[:i]
} |
Beta Was this translation helpful? Give feedback.
-
4.6 |
Beta Was this translation helpful? Give feedback.
-
func eraseStr(s []string) []string {
fmt.Println(s)
var i, j int
for i = 0; i < len(s) && j < len(s); i++ {
j = i + 1
for j < len(s) && s[j] == s[i] {
j++
}
if j-i > 1 {
copy(s[i+1:], s[j:])
fmt.Println(s)
}
}
return s[:i]
}
func main() {
s := []string{"a", "a", "b", "b", "b", "c"}
fmt.Println(eraseStr(s))
} |
Beta Was this translation helpful? Give feedback.
-
func reverseByte() { |
Beta Was this translation helpful? Give feedback.
-
4.7package main
import (
"fmt"
"unicode/utf8"
)
func reverse(s []byte) {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
}
func main() {
str := "你好,世界!Hello, world!"
b := []byte(str)
for i := 0; i < len(b); {
_, size := utf8.DecodeRune(b[i:])
reverse(b[i:i+size])
i += size
}
reverse(b)
fmt.Println(string(b))
} |
Beta Was this translation helpful? Give feedback.
-
// 练习 4.3: 重写reverse函数,使用数组指针代替slice import "fmt" func main() { func reverse(s *[]int) { |
Beta Was this translation helpful? Give feedback.
-
// 练习 4.4: 编写一个rotate函数,通过一次循环完成旋转 import "fmt" func main() { func reverse(s *[]int, n int) { } |
Beta Was this translation helpful? Give feedback.
-
// 练习 4.5: 写一个函数在原地完成消除[]string中相邻重复的字符串的操作。 import ( func main() { func clearRepeat(s []string) []string {
} |
Beta Was this translation helpful? Give feedback.
-
// 练习 4.6: 编写一个函数,原地将一个UTF-8编码的[]byte类型的slice中相邻的空格(参考unicode.IsSpace)替换成一个空格返回 import ( func main() { // 原地消除重复值函数 |
Beta Was this translation helpful? Give feedback.
-
// 练习 4.7: 修改reverse函数用于原地反转UTF-8编码的[]byte。是否可以不用分配额外的内存 import ( func main() { // reverse 原地反转 UTF-8 编码的 []byte,不分配额外内存 |
Beta Was this translation helpful? Give feedback.
-
4.7func Reverse(s []byte) {
// 初始化两个指针 i 和 j,分别指向切片的开头和结尾
for i, j := 0, len(s); i < j; {
// 解码当前字符
_, iLen := utf8.DecodeRune(s[i:])
_, jLen := utf8.DecodeLastRune(s[:j])
// 如果 i 和 j 指向的字符长度不同,则无法交换,直接退出
if iLen != jLen {
break
}
// 交换 i 和 j 位置的字符
for k := 0; k < iLen; k++ {
s[i+k], s[j-jLen+k] = s[j-jLen+k], s[i+k]
}
// 移动 i 和 j 指针,继续处理下一个字符
i += iLen
j -= jLen
}
} |
Beta Was this translation helpful? Give feedback.
-
ch4/ch4-02
中文版
https://gopl-zh.github.io/ch4/ch4-02.html
Beta Was this translation helpful? Give feedback.
All reactions