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)。


相关文章
|
4月前
leetcode-472. 连接词
leetcode-472. 连接词
41 0
|
4月前
leetcode-827:最大人工岛
leetcode-827:最大人工岛
53 0
|
4月前
|
Java
leetcode-474:一和零
leetcode-474:一和零
32 0
顺手牵羊(LeetCode844.)
好多同学说这是双指针法,但是我认为叫它顺手牵羊法更合适
67 0
leetcode 827 最大人工岛
leetcode 827 最大人工岛
56 0
leetcode 827 最大人工岛
|
测试技术
一和零(LeetCode-474)
一和零(LeetCode-474)
130 0
一和零(LeetCode-474)
leetcode第48题
将一个矩阵顺时针旋转 90 度,并且不使用额外的空间。大概属于找规律的题,没有什么一般的思路,观察就可以了。 解法一 可以先转置,然后把每列对称交换交换一下
leetcode第48题
|
存储 算法
leetcode第49题
时间复杂度:两层 for 循环,再加上比较字符串,如果字符串最长为 K,总的时间复杂度就是 O(n²K)。 空间复杂度:O(NK),用来存储结果。 解法一算是比较通用的解法,不管字符串里边是大写字母,小写字母,数字,都可以用这个算法解决。这道题的话,题目告诉我们字符串中只有小写字母,针对这个限制,我们可以再用一些针对性强的算法。 下边的算法本质是,我们只要把一类的字符串用某一种方法唯一的映射到同一个位置就可以。
144 0
leetcode第49题