LeetCode: Implement pow(x, n).

来源:互联网 发布:淘宝店铺怎么设置打折 编辑:程序博客网 时间:2024/06/13 00:29

LeetCode有道题要求实现pow(x,n)即x的n次方,原题地址为:https://leetcode.com/problems/powx-n/

  提交Math.pow(x,n)也能通过 但是很明显没啥意义。
  
  个人想了一个动态规划的实现方式,先将n转换为2进制,然后将x的各个2的指数次幂提前求好,当然2的指数不能(不需要)超过n,然后根据n的2进制,将2进制位上为1的幂进行累成,以3的9次方为例说明:
9的2进制为:1001             //长度为4
设置pows数组 int[] pows = new int[4]    //2进制长度为4,所以大小为4
pows取值为pow[0]=x^(2^0)=x;  pow[1]=x^(2^1); pow[i]=x^(2^i);
根据9的二进制1001,第3位和第0位结果为1,因此最后结果为pow[3]*pow[0],即x^(2^3) * x^(2^0) = x^9.

这样做还是比较快的,代码如下:

import java.util.ArrayList;public class Solution {    //将一个数转换为2进制,因为测试数据中有-2147483648,超出int型的范围    //所以使用double,这样在除以2的时候就需要转换为int型    public ArrayList<Integer> n2binary(double n){        ArrayList<Integer> binary = new ArrayList<Integer>();        while(n>0){            if(n%2==1){                binary.add(1);            }else{                binary.add(0);            }            n = (int)(n/2); //n为double,强制转换        }        return binary;    }    public double myPow(double x, int n) {        boolean neg = false;        double nr;  //n_replace,nr为n的替代值,防止n为负值        if(n<0){                neg = true;            nr = -((double)n);//-2147483648取负值后仍为-2147483648,奇怪,需要先强制转换为double        }else if(n>0){            nr = n;        }else{            return 1;        }        if(x==1){            return 1;        }else if(x==-1){            if(nr%2==0){                return 1;            }else{                return -1;            }        }        double res = 1;        ArrayList<Integer> n2s = n2binary(nr);        //构建大小为k的幂数组,pows[i]的值表示x^(2^i)次方        double[] pows = new double[n2s.size()];        pows[0] = x;        for(int i=1;i<n2s.size();i++){            pows[i] = pows[i-1]*pows[i-1];        }        for(int i=n2s.size()-1;i>=0;i--){            if(n2s.get(i)==1)                res *= pows[i];        }        if(neg){    //指数为负数的处理操作            return 1/res;        }        return res;    }    public static void main(String[] args) {        Solution s = new Solution();        System.out.println(s.myPow(-1, -2147483648));    }}
0 0
原创粉丝点击