剑指 Offer 16. 数值的整数次方
自然最容易想到的就是枚举了,枚举1-n,这里有个细节就是要判断n的正负,并且n也取到了Integer.MIN_VALUE,若是将其反转,就会爆int😂,我也因此WA了好多发。
class Solution {
public double myPow(double x, int n) {
double res = 1.0;
if(n > 0) {
for(int i = 1; i <= n; i++) {
res *= x;
}
} else if (n < 0) {
for(int i = 1; i <= -n; i++) {
res /= x;
}
}
return res;
}
}
O(n)枚举,在一些特殊情况下过不了,比如Integer.MAX_VALUE,数据达到了1e9,O(n)的方式就不太行了。
还有就是可以二分的求,对于,我们可以看成
这里还有一些细节就是对于奇偶数需要额外判断,因为如果是为奇数,那么就会是的结果,会漏掉1,因此需要额外加上去。
并且使用二分的好处在于不用担心会爆,每次进行的都是操作,对于正负数都是一样的。
class Solution {
public double myPow(double x, int n) {
if(n == 0) {
return 1.0;
}
if(n == 1) {
return x;
}
if(n == -1) {
return 1 / x;
}
double half = myPow(x, n / 2);
double mod = myPow(x, n % 2);
if(n % 2 == 1) {
return half * half * mod;
} else {
return half * half;
}
}
}
快速幂的解法需要解决爆int的问题,这里可以进入函数后用long换掉传入的n。
class Solution {
public double myPow(double x, int n) {
double res = 1.0;
if(n == 0) {
return res;
}
long nn = n;
if(nn < 0) {
x = 1 / x;
nn = -nn;
}
while(nn != 0) {
if((nn & 1) != 0) {
res *= x;
}
x *= x;
nn >>= 1;
}
return res;
}
}
这里在进入后就需要判断是否可以换掉负的幂。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?