【go】剑指offer:求一个数的整数次方
时间:2022-07-22
本文章向大家介绍【go】剑指offer:求一个数的整数次方,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
作者 | 陌无崖
转载请联系授权
题目要求
求一个数的整数次方
题目分析
通常我们会很轻松的写出该题的思路,只需要用一个for循环即可,如下:
func Power_one(data float64, n int) float64 {
sum := 1.0
for i := 1; i <= n; i++ {
sum *= data
}
return sum
}
基于以上的思路,其实是有bug的,假如输入的n为0或者小于0呢?因此我们需要对我们的代码进行改进。若n < 0 ,其实我们求出的是一个倒数,即-n次方的倒数。那么我们可以对我们的代码进行如下改进,用一个标记sign记录正负:
func Power_two(data float64, n int) float64 {
if n == 0 {
return 1.0
}
sign := 0
if n < 0 {
n = -n
sign = 1
}
sum := Power_one(data, n)
if sign == 1 && sum != 0 {
return 1.0 / sum
}
return sum
在上面代码我们需要注意的是sum如果为0时,因为0不可为分母,因此0的倒数没有意义。返回1和0都可,但面试时需要和面试官讲清楚。
在上面的代码中,其实还有一处不太完美,我们都知道浮点数中判断两个数相等时,不能直接使用 == ,因为在计算机中表示小数是有精度损失的,一般我们认为当两个数相减时在一个很近的范围我们即认为这两个数相等。代码如下:
func equal(num1, num2 float64) bool {
if num1-num2 > -0.0000001 && num1-num2 < 0.0000001 {
return true
}
return false
}
代码优化
对于上述代码我们的时间复杂度为O(n),那有没有时间复杂度更低的方法呢?举个例子,假如我们要计算2^32,如果我们已经知道了2^16,因此我们只需要在此基础上进行平方即可,同样如果我们知道了2^8,只需要在此基础上进行平方即可,按照这样的思路我们可以写出如下公式:
公式 因此我们可以把求整数次方的代码写成递归的模式,如下:
func Power_one__two(data float64, n int) float64 {
if n == 0 {
return 1.0
}
if n == 1 {
return data
}
sum := Power_one__two(data, n>>1)
sum *= sum
//判断n为奇数还是偶数
if n&1 == 1 {
// 奇数
sum *= data
}
return sum
}
在上面的代码中我们了右移来代表除法,用了位操作与运算判断奇偶性,提高我们代码的运行效率,完整代码如下:
// 降低时间复杂度优化
func Power_four(data float64, n int) float64 {
if n == 0 {
return 1.0
}
sign := 0
if n < 0 {
n = -n
sign = 1
}
sum := Power_one__two(data, n)
if sign == 1 && !equal(sum, 0.0) {
return 1.0 / sum
}
return sum
}
查看完整源码可以点击阅读原文进入github仓库,如果喜欢,感谢你为我点一个星星^_^
END
- 实战-如何获取安卓iOS上的微信聊天记录、通过Metasploit控制安卓
- lightswitch binding custom control
- 3339: Rmq Problem
- Codeforce GYM 100741 A. Queries
- UVA - 11178 Morley's Theorem
- PyMySQL模块的使用
- Python之进程
- Angularjs 通过asp.net web api认证登录
- P3391 【模板】文艺平衡树(Splay)
- 零基础入门小程序 &实战经验分享
- mysql explain详解
- 【前沿】Pytorch开源VQA神经网络模块,让你快速完成看图问答
- #106. 二逼平衡树(附带详细代码注释)
- TensorFlow.js、迁移学习与AI产品创新之道
- 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 数组属性和方法
- motifStack | 绘制motif序列结构图
- 如何优雅的统计基因外显子长度
- Conda | 轻松安装生信工具
- R语言绘图 | 气泡矩阵图
- 在测试自动化中使用Java枚举
- 前端|初学vue
- 使用clusterProfiler对非模式生物进行富集分析
- 微信小程序|逻辑判断
- R语言绘图 | 给气泡矩阵图上个色
- 前端|创建简单动态时钟
- R语言做几何布朗运动的模拟:复杂金融产品的几何布朗运动的模拟
- 手把手教你使用Flask搭建ES搜索引擎(实战篇)
- 【基础篇】Python+Go——带大家一起另寻途径提高计算性能
- 转录组分析 | 使用Trimmomatic过滤Fastq文件
- 转录组分析 | 使用FastQC进行数据质控