【leetcode】50.(Medium )Pow(x,n)

题目链接


解题思路:
这道题的意思就是求x的n次方。
如果xx求下去,求n-1次,这样是超时的。
我的思路是,首先求x
x,然后n就可以减少2,然后求(xx)(x*x),这样n就可以减少4…
就是n不是-1、-1、-1…这样减下去,而是-2、-4、-8…这样减下去
迭代cnt次后,可以让n减少2^(cnt)-1(次)(等比求和),cnt是这么求的:

int cnt=(int)Math.floor(Math.log(n)/Math.log(2));

然后看n还剩下多少,对n进行递归

用一个一位的数组res(result)来记录结果的原因是,我想通过calculatePow来改变两个变量的值,res和n。如果将res设为一个单纯的double变量,无法通过子函数改变res的值,只能建立一个数组,然后将res的值的存到数组里,再将数组传递进入子函数,才能改变这个值。


提交代码:

class Solution {
    public double myPow(double x, int n) {
    	if(n==0)    return (double)1;
        if(x==1)    return (double)1;
        if(x==-1){
            if(n%2==0)  return (double)1;
            else return (double)(-1);
        }
        if(n==Integer.MIN_VALUE)	return 0;
        
    	double res[]=new double[1];
    	res[0]=1;
        boolean flag1=n>0?true:false;  //判断是否取倒数
        int flag2=(x<0)&&(n%2!=0)?-1:1;

        n=Math.abs(n);
        x=Math.abs(x);
        
        while(n>1) 
        	n=calculatePow(x,n,res);
        res[0]*=x;	
        
     if(flag1)	return (double)(flag2*res[0]);
     else return (double)(flag2*1/res[0]);
    }
    
    public int calculatePow(double x,int n,double[] res) {
    	int fold=1;
    	double base=x;
    	int cnt=(int)Math.floor(Math.log(n)/Math.log(2));
    	for(int i=0;i<cnt;i++) {
    		res[0]*=base;
    		base*=base;
    		n-=fold;
    		fold*=2;
    	}
    	return n;
   } 
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/AXIMI/article/details/83894547