「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」
点赞再看,养成习惯。微信搜索【一条coding】关注这个梦想弃码从文程序员。
本文收录于技术专家修炼,里面有我的学习路线、系列文章、面试题库、自学资料、电子书等。欢迎star⭐️
面试的时候遇到这个题目,
然后我思考🤔了片刻,写出了
return pow(x,n);
。面试官问我,为啥这么写?
我说,这是软件工程的代码复用;不重复造轮子;
于是,面试官就要把我挂了😂;
说了一句,我们决定复用公司原来的员工(❁´◡`❁)。
——leetcode此题热评
前言
大家好,我是一条,欢迎来到我的算法频道。
只做有趣的算法题,只为面试写算法。
Question
50. Pow(x, n)
难度:中等
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn )。
示例 1:
输入:x = 2.00000, n = 10 输出:1024.00000
示例 2:
输入:x = 2.10000, n = 3 输出:9.26100
示例 3:
输入:x = 2.00000, n = -2 输出:0.25000 解释:2-2 = 1/22 = 1/4 = 0.25
提示:
-100.0 < x < 100.0 -231 <= n <= 231-1 -104 <= xn <= 104
Solution
这是一道经典快速幂的题。
快速幂法可将求幂的时间复杂度由O(n)
降低至 O(logn)
*。看这样一个例子:
求2的9次幂,首先将9转化为2进制:1001
2^9=2^8+2^1
,我们发现转换为二进制之后,为0的位不需要计算幂,只需要把为1的位计算幂之后相乘。
转换为代码就变得很巧妙,这个模板要记住。
while(b > 0) {
// 判断最低位是否为1
if((b & 1) == 1){
// 如果是1,相乘
res *= x;
}
//x是每次都要计算幂
x *= x;
//二进制位遍历
b >>= 1;
}
另外本题还有一个点是当 n = -2147483648
时执行 n = -n
会因越界而赋值出错,需要使用long
。
注意观察取值范围很重要。
Code
/**
* @author 一条coding
*/
class Solution {
public double myPow(double x, int n) {
if(x == 0.0f) return 0.0d;
long b = n;
double res = 1.0;
if(b < 0) {
x = 1 / x;
b = -b;
}
while(b > 0) {
if((b & 1) == 1) res *= x;
x *= x;
b >>= 1;
}
return res;
}
}
最后
点赞,点赞,还TMD是点赞!