时间复杂度
枚举
枚举就是通过尝试所有可能的解组合来解决问题,解空间必须是离散的。
枚举的流程:
例子:百钱买百鸡
#洁净数:不包含2的数字 n=int(input()) ans=0 for i in range(1,n+1): if '2' not in str(i):#把数字转换成字符串,判断2是否在字符串里面 ans+=1 print(ans)
模拟
递归
通过调用自己来解决问题
通常把大型复杂的问题转换成一个与原问题规模较小的相似问题。
写递归要先写递归出口,然后当前问题如何变成子问题。
汉诺塔问题:
def Move(n,A,B,C): #递归出口 if n==0: return #n-1个盘子从A挪到B Move(n-1,A,C,B) #第n个盘子从A挪到C print("{}->{}".format(A,C)) #n-1个盘子从B挪到C Move(n-1,B,A,C) n=int(input()) Move(n,'A','B','C')
进制转换
任意进制转十进制:
int_to_char="0123456789ABCDEF" char_to_int={} for idx,chr in enumerate(int_to_char): char_to_int[chr]=idx print(char_to_int) def K_To_Ten(k,x): ans=0 #将数字翻转一下 x=x[::-1] for i in range(len(x)): ans=ans+char_to_int[x[i]]*k**i return ans k=8 x='3506' print(K_To_Ten(k,x))
十进制转任意进制:
def Ten_To_K(k,x): #输入:十进制数字x:int 转成k:int进制 #输出:ans:str 转换成k进制的答案 ans='' while x!=0: ans+=int_to_char[x%k] x//=k return ans[::-1] k=2 x=19 print(Ten_To_K(k,x))