博客
关于我
剑指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/

你可能感兴趣的文章
nginx 代理解决跨域
查看>>
Nginx 做负载均衡的几种轮询策略分析
查看>>
Nginx 入门,一篇搞定!
查看>>
Nginx 动静分离与负载均衡的实现
查看>>
Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
查看>>
nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
查看>>
Nginx 反向代理+负载均衡
查看>>
Nginx 反向代理解决跨域问题
查看>>
Nginx 反向代理配置去除前缀
查看>>
nginx 后端获取真实ip
查看>>
Nginx 多端口配置和访问异常问题的排查与优化
查看>>
Nginx 如何代理转发传递真实 ip 地址?
查看>>
Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
查看>>
Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
查看>>
Nginx 学习(一):Nginx 下载和启动
查看>>
nginx 常用指令配置总结
查看>>
Nginx 常用配置清单
查看>>
nginx 常用配置记录
查看>>
nginx 开启ssl模块 [emerg] the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx
查看>>
Nginx 我们必须知道的那些事
查看>>