博客
关于我
剑指offer-面试题16:数值的整数次方
阅读量:256 次
发布时间:2019-03-01

本文共 1472 字,大约阅读时间需要 4 分钟。

题目描述

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

示例 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

方法一(快幂法)

1.解题思路

  • 计算x的n次幂,可以考虑把指数n不断除2,底数x相应变为自己的平方,乘到结果里,如果在这个过程中,指数n为奇数,则在结果里再乘以一个底数x,同时n自减1,当指数n为0时,整个过程就结束了,最终的结果,其值就是x的n次幂。
  • 如果n小于0,则对应地,设一个变量b为n,然后通过b进行操作,同时x变为1/x,b变为-b。
  • 因为java中32为整型范围为(-231 ,231-1),当n为-231 时,取反操作会越界,所以,可以设b的类型为long。

2.代码实现

class Solution {       public double myPow(double x, int n) {           if(n==0) return 1;        long b=n;        if(n<0){               x=1.0/x;            b=-b;        }        double res=1.0;        while(b!=0){               if(b%2==1){                   res*=x;                b-=1;            }            x*=x;            b/=2;        }        return res;    }}

3.复杂度分析

  • 时间复杂度:数字n在循环过程中不断二分,直到变为0,所以时间杂度是O(log2n)
  • 空间复杂度:不需要额外的空间开销,所以空间复杂度为O(1)

方法二(递归)

1.解题思路

  1. 递归终止条件:当n为0,1或-1时,可以直接返回对应的值。
  2. 从上一层递归获取什么:由于每一层都需要对指数n除2,所以需要获取上一层除2之后的那一半,如果不能被2整除,还需要获取上一层除2之后的余数。
  3. 每一层返回什么:返回上一层所得一半的平方再乘以余数,比如27=23*23*21

2.代码实现

class Solution {       public double myPow(double x, int n) {           if(n==0) return 1;        if(n==1) return x;        if(n==-1) return 1.0/x;        double half=myPow(x,n/2);        double mod=myPow(x,n%2);        return half*half*mod;    }}

3.复杂度分析

  • 时间复杂度:数字n在循环过程中不断二分,直到变为0,所以时间杂度是O(log2n)
  • 空间复杂度:递归栈的深度为2分的次数,所以空间复杂度为O(log2n)

剑指offer全集入口:

转载地址:http://ptca.baihongyu.com/

你可能感兴趣的文章
Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
查看>>
MySQL Cluster与MGR集群实战
查看>>
multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
查看>>
mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
查看>>
Multiple websites on single instance of IIS
查看>>
mysql CONCAT()函数拼接有NULL
查看>>
multiprocessing.Manager 嵌套共享对象不适用于队列
查看>>
multiprocessing.pool.map 和带有两个参数的函数
查看>>
MYSQL CONCAT函数
查看>>
multiprocessing.Pool:map_async 和 imap 有什么区别?
查看>>
MySQL Connector/Net 句柄泄露
查看>>
multiprocessor(中)
查看>>
mysql CPU使用率过高的一次处理经历
查看>>
Multisim中555定时器使用技巧
查看>>
MySQL CRUD 数据表基础操作实战
查看>>
multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
查看>>
mysql csv import meets charset
查看>>
multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
查看>>
MySQL DBA 数据库优化策略
查看>>
multi_index_container
查看>>