剑指offer编程题Java实现——面试题11数值的整数次方
题目:
实现函数double power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
解题思路:最一般的方法实现数值的n次方就是将一个数自身连乘n次
底数要考虑到正数、负数和零的情况
指数要考虑到正整数,负整数和零的情况。可能的情况有九种,其中尤其要注意底数为0,指数为负数的情况下是无意义的,因此要做特殊处理
指数为负数的乘方运算,可先按照指数为正求得,然后求倒数得到真正结果
解法一:全面不高效,考虑到所有边界条件和负面测试使用循环计算乘方
解法二:全面高效完美的算法,使用公式,利用递归实现,减少计算次数
a^n=a^(n/2)*a^(n/2) n是偶數
a^n=a^(n/2)*a^(n/2)&a n是奇数
package Solution;
/**
* 剑指offer面试题11:数值的整数次方
* 题目:实现函数double power(double base,int exponent),求base的exponent次方。
* 不得使用库函数,同时不需要考虑大数问题。
* 解题思路:实现数值的n次方就是将一个数自身连乘n次
* 底数要考虑到正数、负数和零的情况
* 指数要考虑到正整数,负整数和零的情况。因此可能的情况有九种,其中尤其要注意底数为0,指数为负数的情况下是无意义的,因此要做特殊处理
* 指数为负数的乘方运算,可先按照指数为正求得,然后求倒数得到真正结果
* 解法一:全面不高效,考虑到所有边界条件和负面测试
* 解法二:全面高效完美的算法,使用公式a^n=a^(n/2)*a^(n/2) n是偶數
* a^(n/2)*a^(n/2)&a n是奇数
* @author GL
*
*/
public class No11Power { public static void main(String[] args) {
System.out.println("底数为2,指数为2运算结果为:"+power(2,2));
System.out.println("底数为2,指数为-2运算结果为:"+power(2,-2));
System.out.println("底数为2,指数为0运算结果为:"+power(2,0));
System.out.println("底数为-2,指数为2运算结果为:"+power(-2,2));
System.out.println("底数为-2,指数为-2运算结果为:"+power(-2,-2));
System.out.println("底数为-2,指数为0运算结果为:"+power(-2,0));
System.out.println("底数为0,指数为2运算结果为:"+power(0,2));
System.out.println("底数为0,指数为0运算结果为:"+power(0,0));
System.out.println("底数为2,指数为1运算结果为:"+power(2,1));
System.out.println("底数为0,指数为-2运算结果为:"+power(0,-2));
} public static double power(double base,int exponent){
if(equal(base,0.0)&&exponent<0)
throw new RuntimeException("while exponent is minus,the base can't be zero");
int absExponent=exponent;
if(exponent<0)
absExponent=~exponent+1;//整数按位取反+1得到他的相反数
//double result=powerWithUnsignedExponent(base,absExponent);
double result= powerWithUnsignedExponentByRecursion( base, absExponent);
if(exponent<0)
result=1.0/result;
return result;
}
//解法一:求指数为非负数时候的乘方运算,连乘
private static double powerWithUnsignedExponent(double base, int absExponent) {
double result=1.0;
for(int i=1;i<=absExponent;i++){
result=result*base;
}
return result;
} //解法二:计算一个数的乘方的时候,通过计算指数的一半次,得到的结果相乘即可得到,这样计算量会大大减少
private static double powerWithUnsignedExponentByRecursion(double base,int exponent){
if(exponent==0)
return 1.0;
if(exponent==1)
return base;
double result= powerWithUnsignedExponentByRecursion(base,exponent>>1);
result=result*result;
if((exponent&0x1)==1)
result=result*base;
return result;
} //浮点数由于精度问题不能用==判断是否想等,如果两数满足一定条件精度,可以看做相等
private static boolean equal(double number1,double number2){
if(number1-number2>-0.0000001&&(number1-number2)<0.0000001)
return true;
return false;
}
}
剑指offer编程题Java实现——面试题11数值的整数次方的更多相关文章
- 剑指offer编程题Java实现——面试题5从头到尾打印链表
题目描述* 剑指offer面试题5:从尾到头打印链表 输入一个链表的头结点,从尾到头打印出每个结点的值 解决方案一:首先遍历链表的节点后打印,典型的"后进先出",可以使用栈来实现这 ...
- 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现
用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具 ...
- 剑指offer编程题Java实现——面试题10二进制中1的个数
题目: 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1,该函数输出2解法:把整数减一和原来的数做与运算,会把该整数二进制表示中的最低位的1变 ...
- 剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈
剑指offer面试题7相关题目:用两个队列实现一个栈 解题思路:根据栈的先入后出和队列的先入先出的特点1.在push的时候,把元素向非空的队列内添加2.在pop的时候,把不为空的队列中的size()- ...
- 剑指offer编程题Java实现——面试题7用两个栈实现队列
题目:用两个栈实现一个队列.队列的声明如下:请实现他的两个函数appendTail和deleteHead, 分别完成在队列尾部插入节点和在队列头部删除节点的功能. package Solution; ...
- 剑指offer编程题Java实现——面试题6重建二叉树
题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...
- 剑指offer编程题Java实现——面试题12打印1到最大的n位数
题目:打印1到最大的n位数 输入数字n,按顺序打印输出从1到最大的n位十进制数,比如输入3,打印从1到999. 这道题考察的地方是如何表示大数问题.由于n是任意大的数组,如果n太大的话n位数就超过了l ...
- 剑指offer编程题Java实现——面试题14调整数组顺序使奇数位于偶数之前
题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有的奇数位于数组的前半部分,偶数位于数组的后半部分. 解题思路:数组中维护两个指针,第一个指针初始化时候指向数组头部,第二个指针初 ...
- 剑指offer编程题Java实现——面试题13在O(1)时间内删除链表节点
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 由于给定的是单向链表,正常删除链表的时间复杂度是查找链表的时间复杂度即O(n),如果要求在O(1)时间复杂度内删除节点 ...
随机推荐
- OC-Objection 学习笔记之一:简单的开始
Objection 统一管理对象的引用问题,我想这就是这种技术的意义吧. 废话不说,咱们直接上步骤吧: 1:协议 我们的意识里要知道,一切围绕协议来进行. 下面的协议是一个视图的协议,该协议简单到不能 ...
- 2.9. Scalar Properties for Primitive Data Types 选项(Core Data 应用程序实践指南)
该选项的意思是,“用Scalar特性来表示原始数据类型”.什么意思,妈妈米呀,这是我学这门课程遇到的最难懂的概念. scalar properties,是复数,也就是说是 “分等级的属性”.那么,大概 ...
- 国民身份证号码校验之“C#/Winform方法实现+案例分析”
根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出 ...
- js bool true false 比较
.想到一个好玩的,运行如下 javascript : if ('0') alert("'0' is true"); if ('0' == false) alert(" ...
- ASP.NET MVC中使用异步控制器
线程池 一直想把项目改写成异步,但是ASP.NETMVC3下写的过于繁琐,.NET 4.5与ASP.NET MVC下代码写起来就比较简单了, MS好像也一直喜欢这样搞,每一个成熟的东西,都要演变好几个 ...
- MyBatis Generator 的使用
1,以插件的形式加入到eclipse/dropins中: 2,设置mybatis-generator.xml文件: <?xml version="1.0" encoding= ...
- chrome与pdf的事情
chrome如果安装了chrome PDF viewer插件,可以直接开发pdf文档: 如果把chrome PDF viewer插件禁用了就不能打开了: 输入:chrome://plugins进行所有 ...
- node源码详解(六) —— 从server.listen 到事件循环
本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource6 本博客同步在https://cnodejs.o ...
- LoadRunner面试题
在LoadRunner中为什么要设置思考时间和pacing 答: 录制时记录的是客户端和服务端的交互,如果要精确模拟 用户的行为,那么客户操作客户端时花费了很多时间要怎么模拟呢?录入 填写提交的内容, ...
- 在GEM5模拟器运行时,对Kill命令的使用
在Linux下开发执行GEM5程序时,需要先启动GEM5,然后使用telnet对GEM5进行连接,才能看到串口信息.因为操作步骤多,所以写了脚本用来运行GEM5和Telnet程序,并且对两个程序进行监 ...