426 字
2 分钟
一些零碎知识的补充
时间复杂度
| 题目给定的数据规模 n | 你应该瞄准的时间复杂度 | 对应的常见算法或数据结构 |
|---|---|---|
| n <= 20 | O(2^n) 或 O(n!) | 回溯法 (Backtracking)、状态压缩 DP |
| n <= 10^2 | O(n^3) | 动态规划 (3D DP)、Floyd 算法 |
| n <= 10^3 | O(n^2) | 双层 for 循环、动态规划 (2D DP) |
| n <= 10^4 ~ 10^5 | O(n log n) 或 O(n) | 最常见! 排序、双指针、二分查找、哈希表、栈/队列 |
| n <= 10^6 | O(n) 或 O(log n) 或 O(1) | 二分查找、数学解法、位运算 |
额外空间复杂度
O(n) : 哈希表、辅助数组和栈和队列
**O(1):**不能去 new 一个同样大小的新数组或哈希表,只能用几个变量作为指针来回倒腾数据
在 Go 中,字符串是一个只读的字节切片([]byte),它不关心这些字节具体是什么编码。
(1) 通过索引访问
s := "hello"for i := 0; i < len(s); i++ { b := s[i] // b 的类型是 byte(uint8) fmt.Printf("%c ", b)}这种方式每次取一个字节,对于 ASCII 字符没问题,但如果字符串包含中文等 Unicode 字符,就会乱码。
(2) 使用 range 遍历
s := "hello"for i, r := range s { // r 的类型是 rune(int32) fmt.Printf("%c ", r)}range 会自动将字节序列按 UTF-8 解码,每次迭代返回一个 rune(即 Unicode 码点,类型为 int32)
‘a’是rune类型
“a”是字符串类型
sort.Slice – 对任意切片自定义排序
当你需要按某种规则排序(比如按绝对值、按结构体字段)时,sort.Slice 最常用。它通过你提供的 less 函数决定顺序。
// 按绝对值降序nums := []int{-5, 2, -8, 3}sort.Slice(nums, func(i, j int) bool { return abs(nums[i]) > abs(nums[j]) // 降序})