Python 输入输出与常用标准库使用手册
一、输入获取(核心两类场景)1. 基础 input()input() 读取一整行,返回字符串,末尾换行自动剔除。 1.1 读取单个数字(数字单独一行)1234# 输入每行仅一个数字a = int(input())f = float(input())s = input() # 读取字符串,原样保留空格 报错场景:一行输入多个数字 2 3,直接 int(input()) 会报错 invalid literal。 1.2 一行多个数字(OJ高频)12345678# 一行两个整数,空格分隔a, b = map(int, input().split())# 一行任意数量数字,存入列表nums = list(map(int, input().split()))# 浮点型多数字x, y = map(float, input().split()) split() 特性:自动按任意空白(空格、Tab、多个连续空格)分割。 1.3 分行读取多组数据123456# 读取n行数字n = int(input())arr = []for _ in range(n): val = int(inp...
Go 语言笔记 & GORM 入门
Go 基础语法导入原则1import "xxx" 导入的包或定义的变量若未使用会编译报错——强制减少无用开销。 类型转换12// 使用 strconv 包进行类型转换// 函数通常返回两个值:结果值和 error goto跳转关键字,可在函数内跳转到指定标签。 函数Go 中不支持函数重载——同一作用域下函数名必须唯一。 1234// 别名 ≠ 原类型,不能直接赋值,但可以显式转换后赋值type MyInt intvar a MyInt = 10var b int = int(a) // 需要显式转换 包 方法能否被外部调用取决于首字母是否大写(public / private 的体现) 同一个包下不能有重名函数 Go 有”声明必使用”的原则,别名声明后就不能再用原名调用 init() 函数源文件执行顺序: 1import → 全局变量定义 → init() → main() 匿名函数123456789// 一次使用func() { ... }()// 多次使用fn := func() { ... }f...
Java 接入 AI 接口
背景如果你的项目使用 JDK 17+,推荐学习 Spring AI 框架。本篇以 JDK 8 项目为例,手搓 AI 接口的接入。 依赖引入123456789101112<!-- Gson for JSON processing --><dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.9</version></dependency><!-- HttpClient for making HTTP requests --><dependency> <groupId>org.apache.httpcomponents.client5</groupId> <artifactId>httpclient5</artifactId> <v...
P1113 杂物
考点拓扑排序、图论、递推 / 记忆化搜索。 思路分析题目给定 n 个任务,每个任务有完成耗时和前置任务。完成所有任务的最短时间,就是从起点到终点的最长路径(因为耗时最长的链决定了整体完成时间)。 本题用 DAG 建图 + 记忆化 DFS 解决: 对每个任务,记录它的前序任务(即谁指向它) 用 DFS 从每个节点出发,递归计算到达该节点的最长路径 记忆化搜索避免重复计算 代码实现123456789static int dfs(int x) { if (f[x] != 0) return f[x]; for (int i = 0; i < edge[x].size(); i++) f[x] = Math.max(f[x], dfs(edge[x].get(i))); f[x] += a[x]; return f[x];}// 建图时注意: edge[y].add(x) 表示 y 是 x 的前序 小结 “完成所有任务的最短时间” 在 DAG 中 = 最长路径 记忆化搜索是 DAG 上 DP 的常用...
Nginx 相关的经历
背景前后端分离的趋势下,Nginx 已经成为后端开发必须了解的技术点之一。 常用命令修改或查看 Nginx 配置时,推荐先用 nginx -t 检测配置文件语法,同时它会输出配置文件路径: 12345# Linuxsudo nginx -t 2>&1 | grep "file"# Windowsnginx -t 2>&1 | findstr "file" 2>&1 的作用是把标准错误(stderr)重定向到标准输出(stdout),因为 nginx -t 的提示信息通常走 stderr 输出。 反向代理配置写法1234567891011server { listen 80; server_name yourdomain.com; location /api { proxy_pass http://localhost:8080; proxy_set_header X-Real-IP $remote_addr; proxy...
行锁和表锁
背景后端开发中经常和数据库打交道,查询速率和耗时一直是需要关注的点。行锁和表锁是其中重要的知识点,而理解它们又绕不开索引。 索引为什么能提升查询速度以 InnoDB 的 B+ 树索引为例。假设有一个数值类型的 id 字段,有 1, 3, 4, 5 四条记录: 无索引:数据按顺序排列,查询需要逐条遍历,时间复杂度 O(n) 有索引:B+ 树结构类似平衡二叉树(左小右大),查询时间复杂度 O(log n) 这就是加索引能大幅提升查询速率的核心原因。 行锁与表锁有了索引的基础,再看锁就清晰了: 行锁:基于索引字段的增删改语句,会锁定对应的索引行。其他事务可以操作表中其他索引行的数据,并发度高 表锁:不基于索引字段的 SQL(如全表扫描),会锁住整张表,其他 SQL 需要等待,效率低 所以在写业务 SQL 时,尽量基于索引字段操作,既能提升查询效率,又能利用行锁减少锁冲突。 小结 索引是行锁的前提,没有索引的 SQL 会退化到表锁 行锁粒度小,并发度高;表锁粒度大,适合批量操作但并发差 业务中尽量通过索引字段来操作数据,避免无意中触发表锁 参考:CSDN - 行锁和表锁
Redis 的使用——排行榜实现
需求背景项目中常把持续使用的数据放到缓存中,以便更快响应、减少数据库操作。排行榜就是一个典型场景——如果每次用户查询都去查数据库,性能会很差。 以基于用户好友的排行榜为例,直接查库需要:获取好友 ID → 判断授权 → 获取数据 → 整合,中间还有各种异常处理,请求量上来后体验堪忧。 核心思路Redis 的 ZSet(有序集合)是实现排行榜的核心数据结构: 有序性:每个元素有一个分数(score),Redis 根据分数排序 唯一性:每个元素唯一,不允许重复 高效操作:支持 O(log N) 的插入、删除、查找,支持按分数范围分页查询 代码实现添加数据到排行榜1234567@Autowiredprivate RedisTemplate redisTemplate;public R add(Double grades, String userId) { redisTemplate.opsForZSet().add("leaderboard", userId, grades); return R.ok();} 获取指定用户排名1...
JAVA-MQ 设置动态的过期队列
需求背景在开发场景中,如预约的签到,用户会有不同的预约签到时间,例如:7:00、7:30、8:00。 对于这种场景,使用定点轮询查表的方式,一方面时间颗粒度需要严格的控制,另一方面在数据库的记录一多就很浪费性能。所以可以考虑使用 MQ 的过期队列来实现功能。 核心思路基于 RabbitMQ 的死信队列: 将消息的存活时间设置为”从当前时间到目标判断截止时间”的时间差 消息过期后自动转入死信队列 在项目中编写方法监听死信队列,触发业务逻辑 这样就实现了动态的过期时间设置,无需轮询数据库。 配置实现1. 定义队列与死信队列配置一个正常队列,设置一个极大的默认过期时间(如 24h),并绑定死信交换机: 123456789@Beanpublic Queue queueLog() { Map<String, Object> args = new HashMap<>(); args.put("x-message-ttl", TTL_MAX); // 消息最大存活时间 24h args.put(&...
Linux 常用命令 & 高并发调优笔记
Linux 命令通用性大部分核心命令(ls, cd, cat, grep, find 等)在不同发行版中通用,遵循 POSIX 标准。 差异主要在包管理器: 发行版 包管理器 Red Hat / CentOS / Fedora yum / dnf Debian / Ubuntu / Mint apt Arch / Manjaro pacman openSUSE zypper 常用文件操作1234567891011121314cat file # 显示文件内容tail -n 10 file # 查看文件末尾 10 行tail -n 10 file | grep "error" # 结合 grep 过滤mkdir dir # 创建文件夹mkdir -p a/b/c # 创建多层级目录mkdir -v dir # 显示创建详情rmdir dir # 删除空目录rm -r d...
01 背包:Knapsack 1
背景第一次在 AtCoder 上做到 01 背包,发现虽然是模板题,但自己写的时候还是卡了不少地方——主要是 Java 的数组类型和下标转换细节。 题目描述给定 N 个物品,每个物品有重量 w[i] 和价值 v[i]。背包容量为 W,求能装入的最大总价值。 每个物品最多选一次,经典的 01 背包问题。 思路分析01 背包的标准做法是用一维 DP 数组,容量从大到小遍历,保证每个物品只取一次。 转移方程: 1f[j] = max(f[j - w[i]] + v[i], f[j]) 其中 f[j] 表示容量为 j 时能获得的最大价值。 关键细节: 数据范围较大,f 数组必须开 long,否则会溢出 Java 中数组下标必须是 int,而 w[i] 存为 long 时需要用 (int) 强转 空间上提前初始化一个足够大的数组(如 maxn = 100005),避免动态扩容 代码实现123456789101112131415161718192021222324252627import java.util.Scanner;public class Y { static...
