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)
        

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值