最大公约数
#递归写法
def gcd(a,b):#最大公因数
if b == 0:
return a
gcd(b,a%b)
#递归写法
def gcd(a,b): #最大公因数
while b > 0:
a,b = b,a%b
return a
最大公倍数
#设d位a,b的最大公约数,则a,b的最大公倍数 = a*b/d
def gcd(a,b): #求最大公因数
while b > 0:
a,b = b,a%b
return a
def lcm(a,b): #求最大公倍数
return a*b/gcd(a,b)
杨辉三角
杨辉三角第n行第m个数可以表示为 C(m-1,n-1) = [(n-1)(n-2)…(n-m+1)]/[(m-1)(m-2)*…*1]
#第8行第4个数是35
def C(m,n): #求组合公式
up = down = 1
for i in range(n-m+1,n+1):
up *= i
for j in range(1,m+1):
down *= j
return up//down
if __name__ == "__main__":
print(C(3,7))
滑动窗口
有字符串answerKey = “TTFF”(只包含T和F), 整数k ,求修改字符串不超过k次后(将T改为F,或将F改为T),最长连续相同子串的长度。
该题可转化为求只包含k个“T”的最长子串长度,和只包含k个“F”的最长子串长度。
n = len(answerKey)
def get_cnt(ch):
cnt = 0#窗口answerKey[left,right]中ch的个数
ans = 0
left = 0#窗口左边界
for right in range(n):
if answerKey[right] == ch:
cnt += 1
while cnt > k:
if answerKey[left] == ch:
cnt -= 1
left += 1
ans = max(ans,right-left+1)
return ans
ans = max(get_cnt("T"),get_cnt("F"))
return(ans)
全排列
#不返回排列结果
nums = [1,2,3]
def permutation(nums,start,end):
if start == end:
print(nums)
return
for i in range(start,end):
nums[start],nums[i] = nums[i],nums[start]#交换
permutation(nums,start+1,end)
nums[start],nums[i] = nums[i],nums[start]#交换
n = len(nums)
permutation(nums,0,n)
#返回排列结果
nums = [1,2,3]
def permutation(a, Already_num):
global temp_list
if len(a) == 0:
temp_list.append(Already_num)
return
for i, element in enumerate(a):
permutation(a[:i]+a[i+1:], Already_num+[element])
return temp_list
temp_list = []
res = permutation(nums,[])
for item in res:
print(item)
#python自带的库实现全排列
import itertools
nums = [1,2,3]
for item in itertools.permutations(nums):
print(item)
'''排列结果
(1, 2, 3)
(1, 3, 2)
(2, 1, 3)
(2, 3, 1)
(3, 1, 2)
(3, 2, 1)'''
组合
#python自带的库实现组合
import itertools
nums = [1,2,3,4]
for item in itertools.combinations(nums,3):#3表示从nums中取3个元素进行组合
print(item)
'''
结果如下
(1, 2, 3)
(1, 2, 4)
(1, 3, 4)
(2, 3, 4)
'''