算法常用技巧


# 数学

等差数列求和:Sn=(a1+an)*n/2;Sn=n*a1+d*(n-1)*n/2
等比数列求和:Sn=a1*(1-qn)/(1-q);Sn=(a1-an*q)/(1-q)
组合数学:A(n,m)=(n!)/(n-m)!;C(n,m)=A(n,m)/m!=(n!)/((n-m)!*m!

唯一分解定理

一个大于 1 的正整数 N,如果它的标准分解式为 N=p1a1+p2a2+…+pnan,那么它的正因数为(a1+1)(a2+1)…(an+1),
其中 pi 为素数(1 不为素数)

斐波那契数公式

class Solution:
def fib(self, n: int) -> int:
    sqrt5 = 5**0.5
    fibN = ((1 + sqrt5) / 2) ** n - ((1 - sqrt5) / 2) ** n
return round(fibN / sqrt5)

# 做题小技巧

综合利用哈希表和前缀和可以解决连续子数组的问题。

有时候通过将问题的值进行变换,可以将问题转化为一个我们已知的问题或较为简单的问题,例如将 0 替换成 - 1,这样就可以使用通过前缀和的知识点来解决子数组中有相同 0 和 1 的问题。

子函数内使用 global 全局函数关键字

遍历的小技巧

for i, w in enumerate(servers):i表示索引,w为实际从server中取出来的值

# 常用函数

# 集合

函数 作用
set1=set() 创建集合
set1.add(6) 增加元素
set1.remove(5) 删除元素

# 字符串

函数 作用
find(sub) 检测 sub 是否存在于字符串中,有则返回索引值,无则返回 - 1
count(sub) 判断 sub 在字符串中出现的次数
isalnum() 如果字符串至少有一个字符并且所有的字符都是字母或数字则返回 True,否则返回 False。
isalpha() 如果字符串至少有一个字符而且所有字符都是字母则返回 True,否则返回 false
isdigit() 如果字符串只包含数字则返回 True,否则返回 false
join() 以字符串为分隔符,插入到 sub 中所有的字符之间 n=“”.join (n)
replace(old,new[,count]) 把字符串中的 old 子字符串替换成 new 子字符串,如果 count 指定,则替换不超过 count 次
split(sep=None,maxsplit=-1) 分隔字符串,默认按照空格作为分隔符切片字符串
splitlines() 按照 “\n” 分隔,返回一个包含各行作为元素的列表
strip([chars]) 删除字符串前边和后边的所有空格,chars 参数可以定制删除的字符

# 数组

函数 作用
copy.deepcopy() 深复制,真正的新建一个数组进行赋值,而不是传引用。使用前需要 import copy。
clear() 清空列表中的元素,留下一个空列表。
append() 向列表添加元素
extend() 使用一个列表来拓展一个列表
remove(sub) 删除 sub 元素
insert(num,index) 在 index 处插入一个 num
pop(index) 弹出 index 处元素
count() 计算出现次数
index() 返回元素位置
reverse() 翻转列表
sort() 排序

# Math 库

函数 作用
math.pow(x, y) 返回 x 的 y 次方
math.ceil(x) 返回不小于 x 的整数
math.fabs(x) 返回 x 的绝对值
math.floor(x) 返回不大于 x 的整数
math.fsum([x, y, …]) 返回无损精度的和
math.sqrt(x) 返回 x 的平方根

# 其他

# datatime

date.isocalendar()        #返回结果是三元组(年号,第几周,第几天)
date.strftime("%j")        #计算输入的日期是一年中的第几天
end=datetime.datetime(year=2020,month=10,day=1)
dela=datetime.timedelta(days=1)
if start.day==1 or start.weekday()==0:#月初或周一

# 优先队列

优先队列是按照递增进行排列的,弹出的数据是最小的元素,如果想让其递减的排列,可以在前面乘一个 - 1.

import heapq     %导入库函数
heapq.heapify(nums)     %将数组转化为优先队列
heapq.heappush(nums,7)     %往优先队列中插入元素
num=heapq.heappop(nums)     %从优先队列中取出元素

# 类的声明

class Potato:#声明类名
    def __init__(self,name):#声明构造方法,self用于在类中传递各种属性
          self.name=name
    def kick(self):
          print("我叫%s。"%self.name);

文章作者: xiqin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 xiqin !
  目录