笔记 | python蓝桥算法复习(预习)基础知识
python算法基础
- 输入
- 转进制:
- 数学运算:
- 字符串
- 统计方法
- 列表
- 字典
- 二维数组
- 取整
- 数学
- 切片
- 输出
- 局部全局问题
- 模板
- 最大公约数
- 最小公倍数
- 二分
- 弗洛伊德
- 并查集
- 最小生成树
- IDLE快捷键
输入
n,m=map(int,input().split())
输入给定n个数:li=list(map(int,input().split()))
支持各种类型数据:(eval(i) for i in input().split())
短循环:加中括号
[print(ans,end=" “) for ans in num]
[nums.append(ans) for ans in num]
将数组变为整个字符串:s=”".join(map(str,num))
转进制:
hex()[10->16];
oct()[10->8];
oct(int(“39”,16)[16->8];
bin()[10->2]
chr()[ascii]
range(ord(‘a’),ord(‘z’)+1)
注意的是出来的是字符串,且有前缀,注意去除
数学运算:
divmode() 返回商和余数
round() 四舍五入
pow(a, b) 求a的b次幂, 如果有三个参数. 则求完次幂后对第三个数取余
取余:divmod(a,b)[a%b]
print(round(4.50)) # 五舍六入:4
print(round(4.51)) #5
阶乘math.factorial(n)
字符串
:replace(oldstr,newstr) split join
rfind()查找字符最后一次出现的位置
s.swapcase() 字母的大小写反转
s.upper() 字母都大写
s.lower() 字母都小写
s.isdigit() 是否都是数字
s.isnumeric() 是否都是数字字符
s.capitalize() 第一个字符大写
s.isalpha() 所有都是字母
s.isalnum() 是否都是字母或数
s.isspace() 字符是否都是空白字符
str.replace(指定字符,目标字符,不超过的次数)
统计方法
statistics.:
mean() 求算术平均值
median() 计算数据的中位数,如果有两个中位数,则返回其平均值
median_low() 数据中的低中位数
median_high() 数据中的高中位数
mode() 计算众数
pvariance() 计算数据的总体方差
列表
list自带函数:
sort【sorted(li)】自动升序,降序reverse=True、按照第三个元素排序arr.sort(key=lambda x:x[2])
max、min、sum、index、pop
index【list.insert(index,obj)】
切片:[开始:结束:步长]
列表可嵌套
列表加法:a+b for a,b in zip(lia,lib)
index索引用法:list.index(x[, start[, end]])
enumerate(list):for index,item in enumerate(li):
reversed(): 将一个序列翻转, 返回翻转序列的迭代器
slice() 列表的切片
filter(function,iterable)
map(function,iterable)
字符串是不可变类型
赋值不改变地址
字典
keys(),values(),items(),del(),clear(),in
函数调用外部变量并修改时,函数内部需要global声明
Counter()统计列表生成字典
d = dict()
for d1, d2 in dominoes:
# 排序后加入字典
index = tuple(sorted((d1, d2)))
if index in d:
d[index] += 1
else:
d[index] = 1
# 计算答案
for i in d:
ans += d[i] * (d[i] - 1) // 2
return ans
dict增改语句相同
setdefault(k,value)
dict遍历:
for i in dict.keys():
for i in dict.values():
for key,value in dict.items():
for i in enumerate(dict):
初始化p=dict((i,0) for i in range(10))
二维数组
创建
dp=[[0 for _ in range(n)] for j in range(m)]
dp=[[0] * n for i in range(m)]
长度:m,n=len(li),len(li[0])
取矩阵第一行并删除
result+=matrix.pop(0)
旋转
matrix=list(zip(*matrix))[::-1]
深拷贝
copy.deepcopy()
取整
ceil(x) 函数返回一个大于或等于 x 的的最小整数
floor() 向下取整
数学
A(n,m)=n!/(n-m)! C(n,m)=A(n,m)/m!=n!/[(n-m)!*m!
12+22+32+…n2=n(n+1)(2n+1)/6
满二叉树:1:最后一层结点无子结点 2:除掉最后一层,任何一层的结点都有两个孩子
完全二叉树:1:最后一层从左往右排列 2:除掉最后一层为满二叉树
求两种树的深度:满二叉树>>log(2,n+1) 完全二叉树>>[log(2,n)]+1
(a+b)%p=(a%p+b%p)%p -*同样
若x>y>0,若p=x%y,那么p一定小于y,即p∈[0,y-1]
切片
切片操作的基本表达式:object[start : end : step]
start:切片的起始位置,如果没有值的话从头开始.
end:切片的结束位置,但不包含end(前闭后开),如果没有值的话表示切割到结束为止.
step:步长,默认取值为1,正数从左往右,负数从右往左. step的正负决定切的方向
[::-1]reverse
for i in range(0,100)[2::3][-10:]: #从第二位开始取,步长为3/从倒数10位开始取
输出
print(‘%.2d:%.2d:%.2d’ % (times, minute, second))
保留小数四舍五入round(num,位数)
[::-1]倒序
print(format(1.23456789, ‘0.10f’)) # 小数点计数法. 保留10位小数:1.2345678900
print参数:end(不换行)、sep
局部全局问题
sum=0
def func(a):
global sum
while a<=10:
sum+=a
a+=1
return sum
模板
最大公约数
def gcd(a,b):
while b:
a,b=b,a%b
return a
def super_gcd(nums):#把你要处理的N个数字放到列表nums里
#基线条件列表长度为1或2
l=len(nums)
if l==1:
return nums[0]
elif l==2:
return gcd(nums[0],nums[1])
else:
return gcd(super_gcd(nums[:l//2]),super_gcd(nums[l//2:]))
最小公倍数
def lcm(a,b):
t=a*b
while b:
a,b=b,a%b
return t//a #因为到最后a,b的值都不是原来的了,需要一开始用t存a*b
二分
l=0
r=N
while l+1!=r
mid=(l+r)//2
if #符合条件:
r=mid
else:
l=mid
return l or r
弗洛伊德
n=结点个数
edge=[[float('inf')]*n for i in range(n)] #初始化所有边权为无穷大
#根据题意更新edge[i][j]
#更新的时候,如果有无向图,需要edge[i][j]=edge[j][i]这样设置,否则不用
#三重循环 结束
for k in range(n):
for i in range(n):
for j in range(n):
edge[i][j]=min(edge[i][j], edge[i][k]+edge[k][j])
并查集
#查找
def find_root(x):
if parent[x]!=x:
parent[x]=find_root(parent[x])
return parent[x]
#合并
def uion(x,y):
x_root,y_root=find_root(x),find_root(y)
parent[x_root]=y_root
最小生成树
n=int(input())
edge=[]#edge[i]=[a,b,c]代表i这条边连接了a,b,权值为c
ans=0#权值和
edge.sort(key=lambda x:x[2])#按边权升序排序
for x in edge:#遍历所有边
a,b,c=x[0],x[1],x[2]
if find_root(a)!=find_root(b) and j<=n-1:#两顶点不连通且当前边数小于n-1
ans+=x[2]#权值累加
union(a,b)
j+=1
print(ans)
IDLE快捷键
快捷键
ALT + 3 : 批量注释
ALT + 4 :批量取消注释
Ctrl + [ :多(单)行代码左移
Ctrl + ] :多(单)行代码右移
Tab:在未完成的变量后使用会出现提示
ALT + / :自动补全
Alt + p(precious):返回上一次的输入
Alt + n(next):与 Alt + p 相反
ALT + Q :在IDLE 编辑器中,将Python代码进行格式化布局