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


相关文章
leetcode 827 最大人工岛
leetcode 827 最大人工岛
56 0
leetcode 827 最大人工岛
|
索引
|
测试技术
一和零(LeetCode-474)
一和零(LeetCode-474)
128 0
一和零(LeetCode-474)
|
算法
leetcode第45题
时间复杂度:O(n)。 空间复杂度:O(1)。 这里要注意一个细节,就是 for 循环中,i < nums.length - 1,少了末尾。因为开始的时候边界是第 0 个位置,steps 已经加 1 了。如下图,如果最后一步刚好跳到了末尾,此时 steps 其实不用加 1 了。如果是 i < nums.length,i 遍历到最后的时候,会进入 if 语句中,steps 会多加 1 。
leetcode第45题
leetcode第38题
难在了题目是什么意思呢? 初始值第一行是 1。 第二行读第一行,1 个 1,去掉个字,所以第二行就是 11。 第三行读第二行,2 个 1,去掉个字,所以第三行就是 21。 第四行读第三行,1 个 2,1 个 1,去掉所有个字,所以第四行就是 1211。 第五行读第四行,1 个 1,1 个 2,2 个 1,去掉所有个字,所以第五航就是 111221。 第六行读第五行,3 个 1,2 个 2,1 个 1,去掉所以个字,所以第六行就是 312
leetcode第38题
|
存储
leetcode第56题
常规的思想,将大问题化解成小问题去解决。 假设给了一个大小为 n 的列表,然后我们假设 n - 1 个元素的列表已经完成了全部合并,我们现在要解决的就是剩下的 1 个,怎么加到已经合并完的 n -1 个元素中。 这样的话分下边几种情况, 我们把每个范围叫做一个节点,节点包括左端点和右端点。 1. 如下图,新加入的节点左端点和右端点,分别在两个节点之间。这样,我们只要删除
leetcode第56题
|
算法
leetcode第47题
基本上都是在上道题的基础上改出来了,一些技巧也是经常遇到,比如先排序,然后判断和前一个是否重复。利用 Hash 去重的功能。利用原来的存储空间隐藏掉数据,然后再想办法还原。
leetcode第47题
leetcode第37题
从上到下,从左到右遍历每个空位置。在第一个位置,随便填一个可以填的数字,再在第二个位置填一个可以填的数字,一直执行下去直到最后一个位置。期间如果出现没有数字可以填的话,就回退到上一个位置,换一下数字,再向后进行下去。
leetcode第37题
|
存储 算法
leetcode第43题
个位乘个位,得出一个数,然后个位乘十位,全部乘完以后,就再用十位乘以各个位。然后百位乘以各个位,最后将每次得出的数相加。十位的结果要补 1 个 0 ,百位的结果要补两个 0 。相加的话我们可以直接用之前的大数相加。直接看代码吧。
leetcode第43题
leetcode第31题
我们想几个问题。 要想使得数字变大,只要任意一位变大就可以。 要想得到刚好大于原来的数字,要变个位。 这里变大数字,只能利用交换。 如果从个位开始,从右往左进行,找一个比个位大的,交换过来,个位的数字交换到了更高位,由于个位的数字较小,所以交换过去虽然个位变大了,但数字整体变小了。例如 1 3 2,把 2 和 3 交换,变成 1 2 3,个位变大了,但整体数字变小了。 个位不行,我们再看十位,如果从十位左边找一个更大的数字交换过来,和个位的情况是一样的,数字会变小。例如 4 1 2 3,把 2 和 4 交换,2 1 4 3,数字会变小。如果从
leetcode第31题