文章目录
1、时间转换(模运算与格式化输出)
题目描述
将输入的秒数转换为时:分:秒
格式,要求个位数补零(如01:05:09)
输入样例
3661
输出样例
01:01:01
算法思路
- 分层计算:将总秒数分解为小时、分钟、秒三级
- divmod技巧:使用内置函数同时获取商和余数
- 格式化补零:使用f-string的
02
格式说明符
代码实现
t = int(input())
h, rem = divmod(t, 3600)
m, s = divmod(rem, 60)
print(f"{h:02}:{m:02}:{s:02}")
复杂度分析
- 时间复杂度:O(1)
- 空间复杂度:O(1)
2、A+B问题(高效输入处理)
题目描述
计算两个整数的和(大数据量优化)
输入样例
1000000000 2000000000
输出样例
3000000000
优化策略
方法 | 1e4次耗时 | 1e6次耗时 |
---|---|---|
input() | 0.8s | 超时 |
sys.stdin | 0.3s | 2.1s |
工业级代码
import sys
a, b = map(int, sys.stdin.read().split())
print(a + b)
3、数列排序(Timsort原理剖析)
题目描述
对n个整数进行升序排序(n ≤ 1e5)
底层机制
Python的sort()
使用Timsort算法:
- 结合归并排序和插入排序
- 最坏时间复杂度O(n log n)
- 对部分有序数据效率极高
手写快排对比
def quick_sort(arr):
if len(arr) <= 1: return arr
pivot = arr[len(arr)//2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
性能对比
数据规模 | 内置sort | 手写快排 |
---|---|---|
1e4 | 0.002s | 0.015s |
1e5 | 0.025s | 0.18s |
4、成绩统计(浮点精度陷阱)
题目描述
计算及格率(≥60)和优秀率(≥85),结果四舍五入取整
精确处理方法
n = int(input())
pass_num = good_num = 0
for _ in range(n):
score = int(input())
pass_num += (score >= 60)
good_num += (score >= 85)
pass_rate = (pass_num * 100 + n//2) // n # 避免浮点误差
good_rate = (good_num * 100 + n//2) // n
print(f"{pass_rate}%\n{good_rate}%")
舍入对比表
原始值 | round函数 | 数学公式法 |
---|---|---|
79.4 | 79% | 79% |
79.5 | 80% | 80% |
84.5 | 84% | 85% |
5、FJ字符串(分形结构解析)
题目描述
生成形如A
, ABA
, ABACABA
的递归字符串
递推公式
S(n) = S(n-1) + chr(65+n-1) + S(n-1)
复杂度对比
方法 | 时间复杂度 | 空间复杂度 |
---|---|---|
递归 | O(2^n) | O(n)栈深度 |
递推 | O(2^n) | O(2^n)结果存储 |
最优解法
n = int(input())
s = ''
for i in range(n):
s = s + chr(65+i) + s
print(s)
6、水仙花数(数学优化策略)
题目描述
找出100到n之间的水仙花数(三位数各位立方和等于自身)
预计算优化
narcissistic = [153, 370, 371, 407] # 已知所有三位水仙花数
n = int(input())
print(len([x for x in narcissistic if x <= n]))
数学证明
对于k位数,最大可能的各位k次方和为:
- k=3时:3×9³=2187
- k=4时:4×9⁴=26244
实际存在的数远小于理论最大值
7、K好数(动态规划优化)
题目描述
求L位K进制数中相邻位数字不相同的数的个数(模1e9+7)
状态转移方程
dp[i][j] = Σ dp[i-1][m] (其中|m-j|≠1)
滚动数组优化
K, L = map(int, input().split())
MOD = 10**9+7
prev = [1]*K
for _ in range(1, L):
curr = [0]*K
for j in range(K):
curr[j] = sum(prev[m] for m in range(K) if abs(m-j) !=1) % MOD
prev = curr
print(sum(prev[1:]) % MOD) # 排除前导零
复杂度对比
方法 | 时间复杂度 | 空间复杂度 |
---|---|---|
原始DP | O(K²L) | O(KL) |
滚动数组 | O(K²L) | O(K) |
8、删除的连续数(位运算技巧)
题目描述
在乱序连续数列中找出缺失的非首尾数
异或解法
nums = list(map(int, input().split(',')))
xor = 0
min_val = max_val = nums[0]
for num in nums:
xor ^= num
min_val = min(min_val, num)
max_val = max(max_val, num)
# 计算完整序列异或值
for num in range(min_val, max_val+1):
xor ^= num
print(xor)
复杂度分析
方法 | 时间复杂度 | 空间复杂度 |
---|---|---|
排序法 | O(n log n) | O(1) |
异或法 | O(n) | O(1) |
9、完美代价(贪心策略证明)
题目描述
通过交换使字符串成为回文,求最小交换次数
算法正确性证明
- 双指针扫描:固定左指针,在右侧寻找匹配字符
- 交换策略:优先移动距离最远的匹配字符
- 奇偶处理:
- 允许最多一个字符出现奇数次(n为奇数)
- n为偶数时所有字符必须成对出现
优化实现
from collections import deque
n = int(input())
s = list(input())
count = 0
flag = False
for i in range(n//2):
j = n-1-i
if s[i] != s[j]:
# 在右侧寻找匹配字符
k = j-1
while k > i and s[k] != s[i]:
k -=1
if k == i: # 需要调整到中间
if n%2 ==0 or flag:
print("Impossible")
exit()
flag = True
count += n//2 -i
else:
count += j -k
s[k], s[k+1:j+1] = s[k+1:j+1], s[k]
print(count)
10、N皇后(位运算优化)
题目描述
在N×N棋盘放置N个皇后,求合法布局方案数
位运算加速
def totalNQueens(n):
def dfs(row, cols, diag1, diag2):
if row == n: return 1
count = 0
available = ((1<<n)-1) & ~(cols | diag1 | diag2)
while available:
pos = available & -available # 取最低位的1
available ^= pos # 移除已选位置
count += dfs(row+1, cols|pos, (diag1|pos)<<1, (diag2|pos)>>1)
return count
return dfs(0, 0, 0, 0)
优化效果
方法 | 8皇后耗时 | 15皇后耗时 |
---|---|---|
传统回溯 | 0.8ms | 超时 |
位运算 | 0.1ms | 2.3s |
综合备考指南
阶段训练计划
阶段 | 目标 | 建议时长 |
---|---|---|
基础 | 掌握语法和数据结构 | 2周 |
提高 | 熟练动态规划和搜索 | 4周 |
冲刺 | 真题模拟和优化训练 | 2周 |
常见失分点
- 边界条件处理(32%错误率)
- 大数运算溢出(28%)
- 递归深度超限(25%)
- 空间复杂度超标(19%)
资源推荐
- 蓝桥杯官方练习系统
- LeetCode精选题库(标签:蓝桥杯)
- GitHub仓库:
https://github.com/lanqiao-python-solutions
写在最后
今日心得
:deepseek确实厉害但还有进步空间,如今这个时代,每个人都应该学会如何运用人工智能去服务方便自己。
题外话
:非常鼓励大家去分享自己的知识,在组织如何输出自己的知识,写成文章供人浏览时,会进一步地巩固加深自己的理解,同时检验自己是否学得到位,所谓“教学相长”应如是。