zoukankan      html  css  js  c++  java
  • 剑指 Offer 16. 数值的整数次方

    1. 题目

    实现 pow(xn) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。

    2. 示例

    示例1:

    输入:x = 2.00000, n = 10
    输出:1024.00000

    示例 2:

    输入:x = 2.10000, n = 3
    输出:9.26100

    示例3:

    输入:x = 2.00000, n = -2
    输出:0.25000
    解释:2-2 = 1/22 = 1/4 = 0.25

    提示:

    -100.0 < x < 100.0
    -231 <= n <= 231-1
    -104 <= xn <= 104

    3. 题解

    一般涉及二进制的都与位运算相关。

    本题采用二分法。

    xn=xn/2 × xn/2= (x2)n/2,令n/2为整数,则需要分为奇偶两种情况:

    • 当n为整数:x=  (x2)n/2
    • 当n为奇数:x= x (x2)n/2,即会多出一项。

    因此,算法流程为:

    • 当 x = 0x=0 时:直接返回 00 (避免后续 x = 1 / xx=1/x 操作报错)
    • 初始化 res = 1res=
    • 当 n < 0n<0 时:把问题转化至 n geq 0n0 的范围内,即执行 x = 1/xx=1/x ,n = - nn=
    • 循环计算:当 n = 0n=0 时跳出
      • 当 n & 1 = 1n&1=1 时:将当前 xx 乘入 resres (即 res *= xres=x )
      • 执行 x = x^2x=x2 (即 x *= xx=x )
      • 执行 nn 右移一位(即 n >>= 1n>>=1)

    3. 实现

     1 class Solution {
     2     // 位运算
     3     public double myPow(double x, int n) {
     4         if(x == 0) return 0;
     5         if(n == 0) return 1;
     6         if(x == 1) return 1;
     7         // 防止n为负数时,-n就会越界
     8         // n属于[−2147483648,2147483647]
     9         long b = n;
    10         double res = 1.0;
    11         // 将n变到正数范围
    12         if(b < 0) {
    13             x = 1 / x;
    14             b = -b;
    15         }
    16         // 遍历
    17         while(b > 0) {
    18             // (b & 1) == 1 等价于 b % 2 == 1
    19             // 当b取2余,多出一项,乘如x
    20             if((b & 1) == 1) res *= x;
    21             // x 变成 x^2
    22             x *= x;
    23             // b>>1等价于b // 2向下取整
    24             b >>= 1;
    25         }
    26         return res;
    27     }
    28 }
    View Code

    4. 结语

      努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!

      如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。

    但行好事 莫问前程
  • 相关阅读:
    XMEGA IO口外部中断操作
    博客开通了
    cocos2d-x CCParticleSystem粒子系统
    获得web api 返回的Dataset 绑定到网格控件上
    DbHelperSQL—— 动软生成DbHelperSQL类
    Silverlight 调用 web api
    await运算符只能用于异步方法中。请考虑用async修饰符标记此方法,并将其返回类型更改为Task
    js如何获取url的参数
    cvbfbd
    【转】selenium及webdriver的原理
  • 原文地址:https://www.cnblogs.com/haifwu/p/14983258.html
Copyright © 2011-2022 走看看