Golang的刷题技巧

基本函数库 字符串技巧、排序等 package main import ( "fmt" "strings" ) func main() { s := " fly me to the moon " // 去除首尾空格 trimmed := s

基本函数库

字符串技巧、排序等

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)
	}
}

LICENSED UNDER CC BY-NC-SA 4.0
Comment