首页 > 编程语言 >力扣50(java)-Pow(x,n)(中等)

力扣50(java)-Pow(x,n)(中等)

时间:2022-08-29 16:01:31浏览次数:62  
标签:java 2m Pow res 力扣 xn double x2 return

题目:

实现 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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/powx-n
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

x n就是将x1,x2,x3,x4,...,xn-1,xn相乘的结果。

一、分解指数、递归

xn:将指数n化小,需要考虑三种情况

1.n为负数的情况:x-n = 1 / xn 

2.n为奇数的情况:先分解出一个n,再将剩下的n-1再分解成(n-1)/2, xn = x * x (n-1)/2 * x(n-1)/2 

3.n为偶数的情况:xn = x n/2 * x n/2 = (x2)n/2

代码:

 1 class Solution {
 2     public double myPow(double x, int n) {
 3       long b = n;
 4       if(b < 0){
 5           return 1 / youPow(x, -b); 
 6         }
 7       return youPow(x, b);
 8 
 9     }
10     public double youPow(double x, long n){
11       //底数为1或者指数为1的情况
12       if(x == 1.0 || n == 0) return 1;
13       if((n % 2) == 0){
14           return youPow(x*x, n/2);
15       }
16       return x * youPow(x, n-1);
17     }
18 }

 二、二进制

将十进制数n转化成二进制形式,设为amam-1...a3a2a1,故二进制与十进制之间的转换为n = 20a1 + 21a2 + 22a3 + ... + 2m-2am-1 + 2m-1am,故xn = x 20a1 + 21a2 + 22a3 + ... + 2m-2am-1 + 2m-1am = x1a1 *  x2a*  x 4a3 * x2m-2am-1 * x 2m-1am

这就把问题转换为

1.求xn转换成求x, x2, x4, x2的m-2(2的m-2次方), x2的m-1(2的m-1次方),循环累乘x2

2.求二进制的各位数

  • 先判断最右位是否为1    ==>    n &1
  • 将n右移一位,判断下一个最右位   ==> n >> 1

整个思路为:

1.先排除x== 0.0的情况,0的任何次幂都为0,直接返回0;

2.将整数n转换成浮点型,因为int的范围为 [−2147483648,2147483647] ,当 n = -2147483648时,n变为正数,就会导致越界;

3.初始化结果res = 1;

4.循环二进制数,直至n = 0时跳出循环:

  • 当n & 1 ==  1时,将x乘入res;
  • 执行x = x 2;
  • 将n右移1位,n >>= 1;

5.返回结果res。

代码:

 1 class Solution {
 2     public double myPow(double x, int n) {
 3       if(x == 0.0) return 0;
 4       long b = n;
 5       if(b < 0){
 6           x = 1 / x;
 7           b = -b;
 8       }
 9       double res = 1.0;
10       while(b > 0){
11           if((b & 1) == 1){
12               res *= x;
13           }
14           x *= x;
15           b >>= 1;
16       }
17       return res;
18     }
19 }

标签:java,2m,Pow,res,力扣,xn,double,x2,return
From: https://www.cnblogs.com/liu-myu/p/16634799.html

相关文章

  • js md5 和java md5后的值不一样
         开发发现js对字符串md5和java对字符串md5计算的结果居然不一样,后来找了一个匹配的这里记录一下注:加密的对象中不能有空格,有空格md5后的结果就不一致,都是眼......
  • javascript中的constructor
    1.使用constructor   constructor是Object类型的原型属性,它能够返回当前对象的构造器(类型函数)。利用该属性,可以检测是否复合类型数据的类型,如对象,数组和函数等。v......
  • Java List集合返回值去掉中括号('[ ]')的操作
    调用StringUtils工具类的strip()方法去掉中括号"[]": 或者自己写工具类publicstaticvoidmain(String[]args){Strings="[aasa,bbbbb]";Strings......
  • Java 基础语法
    Java关键字下面列出了Java关键字。这些保留字不能用于常量、变量、和任何标识符的名称。类别关键字说明访问控制private私有的protected受保护的public......
  • JavaScript设计模式及代码实现——单例模式
    单例模式1定义保证一个类仅有一个实例,并提供一个访问它的全局访问点。2应用时机当一个类的实例被频繁使用,如果重复创建这个实例,会无端消耗资源。比如dialog弹......
  • Java11-Object类,常用API
    day11【Object类、常用API】主要内容Object类Date类DateFormat类Calendar类System类StringBuilder类包装类第一章Object类1.1概述java.lang.Object类是Java......
  • java 常用工具类
    1.时间格式化importorg.apache.commons.lang3.time.FastDateFormat;...FastDateFormatdf=FastDateFormat.getInstance("yyyy-mm-dd");//将指定格式字符串(上面的......
  • 【Java学习Day09】Java知识点及面试题微讲
    Java知识点及面试题整数拓展进制二进制0b八进制0十进制十六进制0xpublicclassDemo03{publicstaticvoidmain(String[]args){intnum1=......
  • java插入PDF文件流到oracle数据库,和读取数据库文件流
    插入:Filefile=newFile("D://b9ef5e9f2ec04dfd984fa55ae6552ee6-1.pdf");if(file.exists()){InputStreamfin=newFileInputStrea......
  • java使用多种方式实现多线程及线程池的使用
    ​ 一、多线程实现了什么?为了解决负载均衡问题,充分利用CPU资源.为了提高CPU的使用率,采用多线程的方式去同时完成几件事情而不互相干扰.为了处理大量的IO操作时或处理......