笔记 | 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代码进行格式化布局

你可能感兴趣的:(python,算法)