LeetCode: Implement pow(x, n).
2015-08-14 20:25
459 查看
LeetCode有道题要求实现pow(x,n)即x的n次方,原题地址为:https://leetcode.com/problems/powx-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.
这样做还是比较快的,代码如下:
提交
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.
这样做还是比较快的,代码如下:
[code]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)); } }
相关文章推荐
- Java集群优化——必须了解的内存溢出与内存泄露
- POJ 3903 Stock Exchange
- nc命令
- Codeforces Gym 100523C C - Will It Stop? 水题
- yii 框架GridView::widget 检索框
- 二分匹配 HDU1068 Girls and Boys
- Erlang库 -- 有意思的库汇总
- 华为训练题:初级——合并表记录(字典,简单题)
- 循环,迭代,遍历的区别
- Google后Hadoop时代的新“三驾马车”
- hdu 1250 高精度+斐波那契
- 减少科研文章写作错误的一点小技巧
- MAVEN for mac 安装
- 【转载】UIScrollView
- PAT 1073. Scientific Notation (20)
- ThreadLocal用法和实现原理
- hdu 5381 The sum of gcd
- 谷歌技术"三宝"之谷歌文件系统
- [SDOI2015][BZOJ3991] 寻宝游戏|set|dfs序|虚树|树上倍增LCA
- centos7下安装adagios