剑指offer 面试题11 数值的整数次方
来源:互联网 发布:淘宝苏宁易购怎么自提 编辑:程序博客网 时间:2024/06/03 16:57
剑指offer 面试题11 数值的整数次方
题目:
实现函数 double Power(double base, int exponent),求 base 的 exponent 次方。
不得使用库函数,同时不需要考虑大数问题。
package algorithm.foroffer.top20;/** * Created by liyazhou on 2017/5/25. * 面试题11:数值的整数次方 * 题目: * 实现函数 double Power(double base, int exponent),求 base 的 exponent 次方。 * 不得使用库函数,同时不需要考虑大数问题。 * * 问题: * 1. 指数 exponent可能为 0 或者负数 * 2. 底数为 0 的特殊情况, 0^0 = 1,0^n = 0 * 3. 判断 double 型底数是否为 0,虽然double 类型不是精确类型,但是Java语言支持使用等号判断 * * 思路: * 1、exponent == 0, 返回 1 * 2. base == 0, 返回 0 * 3. base!=0, exponent < 0, 累乘 1/base abs(exponenet)次 * 4. base!=0, exponent > 0, 累乘 1/base exponent 次 * */public class Test11 { /** * 一般做法 * @param base 底数 * @param exponent 幂次,指数 * @return 幂运算结果 */ public static double power(double base, int exponent){ if (exponent == 0) return 1.0; // 任何数的零次幂结果均为 1 if (base == 0) return 0.0; if (exponent < 0) { base = 1 / base; exponent = -exponent; } return powerWithPositiveExponent(base, exponent); } private static double powerWithPositiveExponent(double base, int exponent) { double result = 1.0; for (int i = 0; i < exponent; i++) result *= base; return result; } /** * 优化的方法,折半的思想,可以减少 abs(exponent)/2 次循环, * 如果exponent较大,可以多次折半 * @param base 底数 * @param exponent 幂次,指数 * @return 幂运算结果 */ public static double power2(double base, int exponent){ if (exponent == 0) return 1.0; // 任何数的零次幂结果均为 1 if (base == 0) return 0.0; if (exponent < 0) { base = 1 / base; exponent = -exponent; } double result = powerWithPositiveExponent(base, exponent>>1); // 折半计算,减少循环次数 result *= result; if ((exponent & 1) == 1) result *= base; // 按位与 1,判断整数为奇数还是偶数 return result; } public static void main(String[] args){ double[] bases = {0, 10, -1, 5}; int[] exponents = {0, -5, -3, 4}; for (int i = 0; i < bases.length; i++){ System.out.println(String.format("power(%.6f, %d) = %.6f", bases[i], exponents[i], Test11.power(bases[i], exponents[i]))); System.out.println(String.format("power2(%.6f, %d) = %.6f", bases[i], exponents[i], Test11.power2(bases[i], exponents[i]))); } }}
// 进一步优化,使时间复杂度降为 log(n) // 2017年10月4日22:11:28 public static double pow(double base, int exponent){ if (exponent == 0) return 1; boolean isNegative = exponent < 0; if (isNegative) exponent = - exponent; int lgn = (int)Math.log(exponent); double result = base; for (int i = 0; i < lgn; i ++) result *= result; for (int j = 0; j < exponent-Math.pow(2, lgn); j ++) result *= base; if (isNegative) result = 1/result; return result; }
阅读全文
1 0
- [剑指offer][面试题11]数值的整数次方
- 【剑指offer】面试题11:数值的整数次方
- 剑指offer 面试题11 数值的整数次方
- 剑指Offer:面试题11 数值的整数次方
- 《剑指Offer》面试题11:数值的整数次方
- 【剑指Offer学习】【面试题11 :数值的整数次方】
- 剑指offer-面试题11:数值的整数次方
- 剑指offer之面试题11:数值的整数次方
- 剑指offer----面试题11:数值的整数次方
- 剑指offer之面试题11数值的整数次方
- 剑指Offer--面试题11 数值的整数次方
- 剑指Offer----面试题11:数值的整数次方
- 剑指offer-面试题11:数值的整数次方
- 剑指offer面试题11:数值的整数次方
- 剑指offer--面试题11: 数值的整数次方
- 剑指Offer之面试题11:数值的整数次方
- 剑指offer-面试题11-数值的整数次方
- 剑指Offer系列-面试题11:数值的整数次方
- flask实践03-创建web表单
- qml继承
- hash-map 相关参考博客
- 生成RSA密钥对
- splice方法和slice方法的区别
- 剑指offer 面试题11 数值的整数次方
- Text模式和PDU模式的区别
- 30 类 CSS 选择器
- Android屏幕直播方案
- 关于VM12使用U盘(优启通)启动的设置,安装Windows7gost
- Sketch Tutorial
- 在c#中调用python
- struts2返回数据到EasyUi或者bootstrap的表格
- jsp中点击一个多选框,实现全选或全不选