题:计算x的n次幂函数
法1:这题实习面试的时候被问过两次了...不知道为什么考到的概率会这么大。一次是在头条的ailab三面,一次是阿里淘宝技术部的一面,每次我最熟悉的都是循环写法,不是普通的循环,直接乘n次x肯定不对。而是分n为奇偶,1)n为奇的话每次res*=x,n-=1;2)n为偶的话,每次使得x=x*x,n//=2, res不变即可
def myPow(self, x, n):
"""
:type x: float
:type n: int
:rtype: float
"""
flag=1
if x<0 and n==0:return None
if n==0:return 1
if n<0:
flag=-1
n=abs(n)
res=1
while n>0:
if n&1:
n-=1
res*=x
else:
n//=2
x=x*x
if flag==-1:
res=1/res
if res<=-2**31 or res>=2**31-1:return 0
return res
法2:优化法1中间的循环部分,当n为奇数的时候,额外res*=x,然后每次都使得x*=x,n>>=1
def myPow(self, x, n):
"""
:type x: float
:type n: int
:rtype: float
"""
flag=1
if x<0 and n==0:return None
if n==0:return 1
if n<0:
flag=-1
n=abs(n)
res=1
while n>0:
if n&1:
res*=x
n>>=1
x*=x
if flag==-1:
res=1/res
if res<=-2**31 or res>=2**31-1:return 0
return res
法3:递归,两次面试递归我都写的不好...其实思想是一样的,n为奇数的话就让n-=1,再让当前结果乘x,如果n为偶数的话,x=x**2,n//=2
def myPow(self, x, n):
"""
:type x: float
:type n: int
:rtype: float
"""
flag=1
if x<0 and n==0:return None
if n==0:return 1
if n<0:return 1/self.myPow(x,-n)
if n&1:return x*self.myPow(x,n-1)
else:return self.myPow(x*x,n//2)