leetcode第50题

简介: 求幂次方,用最简单的想法,就是写一个 for 循环累乘。至于求负幂次方,比如 2^{-10}2−10,可以先求出 2^{10}210,然后取倒数,1/2^{10}1/210 ,就可以了double mul = 1;if (n > 0) { for (int i = 0; i < n; i++) { mul *= x; }} else { n = -n; for (int i = 0; i < n; i++) { mul *= x; } mul = 1 / mul;}

image.png

就是求幂次方。

解法一

求幂次方,用最简单的想法,就是写一个 for 循环累乘。

至于求负幂次方,比如 2^{-10}210,可以先求出 2^{10}210,然后取倒数,1/2^{10}1/210 ,就可以了

doublemul=1;
if (n>0) {
for (inti=0; i<n; i++) {
mul*=x;
    }
} else {
n=-n;
for (inti=0; i<n; i++) {
mul*=x;
    }
mul=1/mul;
}

但这样的话会出问题,之前在29题讨论过,问题出在 n = - n 上,因为最小负数 -2^{31}231取相反数的话,按照计算机的规则,依旧是-2^{31}231,所以这种情况需要单独讨论一下。

if (n==-2147483648) {
return0;
}

当然,这样做的话 -1 ,和 1 也需要单独讨论下,因为他们的任意次方都是 1 或者 -1

if (x==-1) {
if ((n&1) !=0) { //按位与不等于 0 ,说明是奇数return-1;
    } else {
return1;
    }
}
if (x==1.0)
return1;

代码出来了

publicdoublemyPow(doublex, intn) {
if (x==-1) {
if ((n&1) !=0) {
return-1;
        } else {
return1;
        }
    }
if (x==1.0)
return1;
if (n==-2147483648) {
return0;
    }
doublemul=1;
if (n>0) {
for (inti=0; i<n; i++) {
mul*=x;
        }
    } else {
n=-n;
for (inti=0; i<n; i++) {
mul*=x;
        }
mul=1/mul;
    }
returnmul;
}

时间复杂度:O(n)。

从一般的方法,到递归,最后的解法,直接从 2 进制考虑,每一个数字,都可以转换成 2 的幂次的和,从而实现了最终的解法。

空间复杂度:O(1)。


相关文章
|
8月前
|
算法
leetcode1刷题打卡
leetcode1刷题打卡
45 0
|
8月前
刷题之Leetcode203题(超级详细)
刷题之Leetcode203题(超级详细)
40 0
刷题之Leetcode203题(超级详细)
|
8月前
|
算法
刷题之Leetcode59题(超级详细)
刷题之Leetcode59题(超级详细)
38 0
|
8月前
刷题之Leetcode283题(超级详细)
刷题之Leetcode283题(超级详细)
34 0
|
8月前
|
算法
刷题之Leetcode704题(超级详细)
刷题之Leetcode704题(超级详细)
29 0
|
8月前
|
算法
leetcode:389. 找不同
leetcode:389. 找不同
32 0
|
8月前
|
测试技术 索引
leetcode707刷题打卡
leetcode707刷题打卡
34 0
单链表反转 LeetCode 206
单链表反转 LeetCode 206
82 0