基本函数库
字符串技巧、排序等
package main
import (
"fmt"
"strings"
)
func main() {
s := " fly me to the moon "
// 去除首尾空格
trimmed := strings.TrimSpace(s)
// 分割字符串,并去除中间多余的空格
fields := strings.Fields(trimmed)
// 使用单个空格连接字符串
result := strings.Join(fields, " ")
fmt.Println(result) // 输出: "fly me to the moon"
}
// Int转字符串 不要用string强转
strconv.Itoa(tVal)
// 判断是否为字母/数字
unicode.IsDigit(char)
unicode.IsLetter(char)
// 转小写
unicode.ToLower(char)
strings.ToLower(s)
//反转
slices.Reverse(slice)
// 排序
sort.slices(slice)
// 结构体排序
sort.Slice(citys, func(i, j int) bool {
return citys[i].cost > citys[j].cost
})
// 普通排序
sort.Slice(test, func(i, j int) bool {
return test[i] > test[j]
})
// 用slices的sortFunc 要用-1 0 1表示
slices.SortFunc(citys, func(a, b City) int {
if a.cost < b.cost {
return 1
} else if a.cost == b.cost {
return 0
} else {
return -1
}
})
// 创建动态二维数组
// 给定row,col
mapRow := make([][]int, row)
for i := range mapRow {
mapRow[i] = make([]int, col)
}
// 字符串转int
// 使用 strconv.Atoi
str1 := "123"
i1, err1 := strconv.Atoi(str1)
if err1 != nil {
fmt.Println("Error:", err1)
} else {
fmt.Println("Converted integer using Atoi:", i1)
}
// 使用 strconv.ParseInt
str2 := "123"
i2, err2 := strconv.ParseInt(str2, 10, 64)
if err2 != nil {
fmt.Println("Error:", err2)
} else {
fmt.Println("Converted integer using ParseInt:", i2)
}
ACM 的IO模式
fmt.Scanf
很慢,用bufio
reader := bufio.NewReader(os.Stdin)
然后用fmt.Fscan(reader,变量…)
Fscan 从 r 中读取文本,扫描并将连续的以空格分隔的值存储到连续的参数中。换行符也算作空格。它返回成功扫描的项目数量。如果这个数量少于参数数量,err 将报告原因。
如下:二维前缀和输入模板:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
var n, m, q int
fmt.Fscan(reader ,&n, &m, &q)
// init matrix
matrix := make([][]int, n+1)
for i := 0; i <= n; i++ {
matrix[i] = make([]int, m+1)
}
// input
for i := 1; i <= n; i++ {
for j := 1; j <= m; j++ {
fmt.Fscan(reader, &matrix[i][j])
}
}
// 构造二维前缀和
presum := make([][]int, n+1)
for i := 0; i <= n; i++ {
presum[i] = make([]int, m+1)
}
for i := 1; i <= n; i++ {
for j := 1; j <= m; j++ {
presum[i][j] = presum[i-1][j] + presum[i][j-1] - presum[i-1][j-1] + matrix[i][j]
}
}
for i := 1; i <= q; i++ {
var x1, y1, x2, y2 int
fmt.Fscan(reader, &x1, &y1, &x2, &y2)
ans := presum[x2][y2] - presum[x2][y1-1] - presum[x1-1][y2] + presum[x1-1][y1-1]
fmt.Println(ans)
}
}
更快的方法,直接当字符串处理 然后用TrimSpace去除空格,再Split分割空格得到字符串数组,再把对应字符串转为int:
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
line, _ := reader.ReadString('\n')
line = strings.TrimSpace(line)
nmq := strings.Split(line, " ")
n, _ := strconv.Atoi(nmq[0])
m, _ := strconv.Atoi(nmq[1])
q, _ := strconv.Atoi(nmq[2])
// init matrix
matrix := make([][]int, n+1)
for i := 0; i <= n; i++ {
matrix[i] = make([]int, m+1)
}
// input
for i := 1; i <= n; i++ {
line, _ := reader.ReadString('\n')
line = strings.TrimSpace(line)
values := strings.Split(line, " ")
for j := 1; j <= m; j++ {
matrix[i][j], _ = strconv.Atoi(values[j-1])
}
}
// fmt.Println("matrix:\n", matrix)
// 构造二维前缀和
presum := make([][]int, n+1)
for i := 0; i <= n; i++ {
presum[i] = make([]int, m+1)
}
for i := 1; i <= n; i++ {
for j := 1; j <= m; j++ {
presum[i][j] = presum[i-1][j] + presum[i][j-1] - presum[i-1][j-1] + matrix[i][j]
}
}
for i := 1; i <= q; i++ {
line, _ := reader.ReadString('\n')
line = strings.TrimSpace(line)
queries := strings.Split(line, " ")
x1, _ := strconv.Atoi(queries[0])
y1, _ := strconv.Atoi(queries[1])
x2, _ := strconv.Atoi(queries[2])
y2, _ := strconv.Atoi(queries[3])
ans := presum[x2][y2] - presum[x2][y1-1] - presum[x1-1][y2] + presum[x1-1][y1-1]
fmt.Println(ans)
}
}