剑指offer-数值的整数次方

题目描述

  • 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
  • 地址:牛客链接

解决方法

  • 这是一道极其经典的位运算题目
  • 首先,这是一个有很多特殊情况的题:
    • 指数为0时,直接返回1
    • 底为0,但是指数为负数时,发生除0异常,指数为正数时,返回0;
    • 其他情况(使用以下三种方法)
  • 方法1:判断完边界条件后,直接循环,若指数绝对值大小为 n ,那么该方法时间复杂度为 O(n)
  • 方法2 : 利用快速幂的思想,例如 求 3^11, 那么指数 11 的二进制为 1011 ,对于 1011 ,从右到左,每一位分别对应着 1, 2, 4, 8.而 3^11 = 3^(1011) = 3^(1000 + 0010 + 0001)= 3^8 * 3^2 + 3^1。所以我们可以这样看,1011从右到左依次对应着 3,3^2, 3^4, 3^8,这是一种翻倍的关系。
    所以,只要我们对指数的二进制逐位得到每一位数字,看当前位是1还是0,若是1,则累乘进res,并在每一次逐位的过程中完成翻倍,3,3^2, 3^4, 3^8。
    那么如何逐位得到二进制的每一位数字呢? 利用 左移>> 与 & ,&1 可以得到最低位的值,然后 将当前数字 >> 可以得到 下一位值上的数,直至变为0。

    时间复杂度: O(log N)

  • 方法3: 递归。3^11 = 3^5 * 3^5 3 3^10 = 3^5 3^5. 所以首先判断指数的奇偶性

    • 若为奇数:f(base, exp) = f(base, exp > >1) * f(base, exp > >1) * base
    • 若为偶数:f(base, exp) = f(base, e
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值