50.Pow(x,n)--python

题:计算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)
        
发布了56 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/karen17/article/details/88891317
今日推荐