zoukankan      html  css  js  c++  java
  • 【LeetCode】面试题16. 数值的整数次方

    题目:

    思路:

    1、最简单直观的方法就是循环相乘,但是会超时

    2、快速幂(二进制角度)
    对于任意十进制n,设其二进制为(b_m)...(b_2b_1),则有

    • (n=1b_1 + 2b_2 + ... + 2^{m-1}b_m)
    • (x^n = x^{1b_1 + 2b_2 + ... + 2^{m-1}b_m} = x^{1b_1}x^{2b_2}...x^{2^{m-1}b_m})

    根据上面的推导,可以把(x^n)的计算,转化为

    • 计算(x^1, x^2, ..., x^{2^{m-1}})的值,循环赋值即可(x=x^2)
    • 获取二进制各位(b_1, b_2, ..., b_m)的值,循环执行与操作、移位操作即可

    3、快速幂(递归二分)

    4、快速幂(非递归二分)
    非递归形式同二进制形式原理相同,以(x^{77}=xcdot x^4 cdot x^8 cdot x^{64})为例,x一直在累积平方,遇到奇数则将当前的x乘到结果上。

    ( egin{aligned} x^{77} =& (x^2)^{38} * x 1 \ (x^2)^{38} =& (x^4)^{19} 0 \ (x^4)^{19} =& (x^8)^9 * x^4 0 \ (x^8)^9 =& (x^{16})^4 * x^8 1 \ (x^{16})^4 =& (x^{32})^2 0 \ (x^{32})^2 =& (x^{64})^1 0 \ (x^{64})^1 =& (x^{128})^0 * x^{64} 1 end{aligned} )

    代码:

    Python

    class Solution(object):
        def myPow(self, x, n):
            """
            :type x: float
            :type n: int
            :rtype: float
            """
            # 暴力循环求解 291/304 超时
            # t = abs(n)
            # result = 1.0
            # while t:
            #     result *= x
            #     t -= 1
            # if n < 0:
            #     return 1.0 / result
            # else:
            #     return result
    
            # # 快速幂(二进制)
            # t = abs(n)
            # result = 1.0
            # while t:
            #     if t & 1:
            #         result *= x
            #     x *= x
            #     t >>= 1
            # if n < 0:
            #     return 1.0 / result
            # else:
            #     return result
    
            # # 快速幂(递归二分)
            # if n == 0:
            #     return 1.0
            # if n < 0:
            #     return 1.0 / self.myPow(x, -n)
            # if n & 1:
            #     return x * self.myPow(x, n-1)
            # return self.myPow(x * x, n // 2)
    
            # 快速幂(非递归二分, 同二进制思想一致)
            result = 1.0
            t = abs(n)
            while t:
                if t % 2:
                    result *= x
                x *= x
                t //= 2
            if n < 0:
                return 1.0 / result
            else:
                return result
    

    相关问题

  • 相关阅读:
    Excel技巧大全
    2019年6月27日单词
    HTML5(12) 实时通讯WebSocket
    C#(99):随机数Random
    C#(99):C# 8.0 的新特性( NET Framework 4.8 与 Visual Studio 2019 )
    2019年6月13日单词
    2019年6月5日单词
    2019年5月30日单词
    used to do 与be used to doing /n.
    Json.Net(一)介绍
  • 原文地址:https://www.cnblogs.com/cling-cling/p/12966453.html
Copyright © 2011-2022 走看看