Day12 :数值的整数次方
剑指Offer_编程题——数值的整数次方
题目描述:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0
具体要求:
时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M
具体思路:
思路一: 其实是一种最简单最暴力的算法,也不用考虑任何条件,直接根据数学知识即可解决,即用python实习如下:
class Solution:
def Power(self, base, exponent):
return base ** exponent
代码效果图如图所示:
思路二: 其实利用左移和右移即可实现,因此我们介绍左移和右移的计算过程。 1、<<:左移运算符,num << 1, 相当于num乘以2 2、>>:右移运算符,num >> 1,相当于num除以2 3、>>>:无符号右移符,忽略符号位,空位都以0补齐(负数用1补齐) 接下来介绍介绍一种新型的判断奇偶数的方法: 众所周知,我们一般判断奇偶数就是用这个数对2取模,如果为0则为偶数,否则为奇数。这种方法符合我们的日常思维,但是运行时间较慢。另一种方法就是用二进制中的“与”运算符。用a&1来判断a的奇偶性。二进制的末尾为0表示偶数,末尾为1则是奇数。 具体用java来实现这一思路:
public class Solution{
public double Power(double base, int exponent){
if(exponent < 0 && base == 0)throw new RuntimeException("分母不能为0");
int exp = Math.abs(exponent);
if(exponent == 0)
return 1;
if(exponent == 1)
return base;
double result = Power(base, exp >>> 1);
result *= result;
if((exp & 1) == 1){
result *= base;
}
return exponent < 0 ? (1.0 / result) : result;
}
}
代码效果图如图所示:
如果我们要在编译器中运行,得添加上main()即可;具体实现如下:
public static void main(String[] args){
Solution s1 = new Solution();
System.out.printIn(s1.Power(5.0, 3));
}
代码在编译器测试效果如下:
思路三: 可以使用迭代去做。根据题意可知,exponent是整数。因此我们这里需要考虑exponent是0或者负数的情况: 1、当exponent是正数时,按照我们正常的迭代计算即可 2、当exponent是0时,直接返回0即可 3、当exponent是负数时,可以先求出其绝对值的结果,再取倒数
class Solution:
def Power(self, base, exponent):
if exponent < 1:
return 1 / self.getPower(base, -exponent)
else:
return self.getPower(base, exponent)
def getPower(self, base, exponent):
if base == 0:
return 0
elif exponent == 1:
return base
res = 1
for i in range (exponent):
res *= base
return res
代码效果图如图所示:
针对思路三的想法,我们可以对exponent为正数的时候,做一个简单的优化,即我们可以使用我们熟悉的递归来高效的求出正数的整数次方,从而提高运行时间。
class Solution:
def Power(self, base, exp):
if exp < 1:
return 1 / self.getPower(base, -exp)
else:
return self.getPower(base, exp)
def getPower(self, base, exp):
if exp == 0:
return 1
elif exp == 1:
return base
res = self.Power(base, exp >> 1)
res *= res
if exp & 1 == 1:
res *= base
return res
代码效果图如图所示:
总结
本道题主要通过求指数来考察用代码实现计算,本文中运用了各种思路,其中包括我们这几天一直用的递归算法。当然,在本文中我们还介绍了左移和右移的原则以及介绍了一种全新的判断一个数奇偶性的方法,发现运行时间提高了不少。在做完题目之后,我们应该擅于总结,吸取别人做的好的思路,不断的提高自己的思路,提高自己分析问题的思路和写代码的能力。总之,继续加油,争取早日找到工作,Good Luck!!!
参考文献
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C++核心准则T.47:避免使用通用名称的高度不受限模板
- python函数——字符串字母大小判断
- Day 6:旋转数组的最小数字
- MapReduce工作笔记——yarn reducer 内存溢出 beyond physical memory limits
- Linux实用技巧——find查找指定时间内修改过的文件或目录
- 数据结构算法操作试题(C++/Python)——最接近的三数之和
- 数据结构算法操作试题(C++/Python)——字符串转换整数 (atoi)
- 数据结构算法操作试题(C++/Python)——电话号码的字母组合
- 数据结构算法操作试题(C++/Python)——删除链表的倒数第N个节点
- Day 7:斐波那契数列
- Day8 :跳台阶
- Linux Signal 一网打尽
- Day9 :变态跳台阶
- Day10 :矩形覆盖
- vue3.0新特性初体验(二)