Maple's Blog.

Leetcode-50

字数统计: 593阅读时长: 2 min
2019/04/08 Share

myPow-链接

如果按照以下的这个代码提交的话还有3个样例过不了(一共304个样例),这里面有个坑….下面我就来说说这个坑

起初一眼看过去,嗯!快速幂,没错,就是的,只是这个题的数据有点卡,题目如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
实现 pow(x, n) ,即计算 x 的 n 次幂函数。

示例 1:

输入: 2.00000, 10
输出: 1024.00000
示例 2:

输入: 2.10000, 3
输出: 9.26100
示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:

-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

他这里的n的范围是在:

INT_MIN<=n<=INT_MAX;

而….(真实情况是这样de)

INT_MIN=-2147483648

INT_MAX=2147483647

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class Solution {
public:
double myPow(double x, int n) {
double ans=1;
double base=x;
//给定一个标记,m=1代表n>0;
int m=1;
//1的任何次方都是1;
if(x==1)
{
return x;
}
//-1的偶数此方是1,奇数次方是-1;
if(x==-1)
{
if(n%2==0)
return 1;
else
return -1;
}
//如果n==0,则0次方为1;
if(n==0)
return 1;
//如果n是个负数,则答案就要变成1/ans;
if(n<0)
{
m=0; //n<0,标记m=0;
n*=-1; //让n变成正数进行计算,但是,这里如果n=INT_MIN,一旦n=n*(-1)的时候,就会造成溢出,因为-INT_MIN在int的情况下是会溢出的....,所以这里就要用到将n转化为long long 的数据类型来存储了
}
//好了,到了这里就是一个快速幂的板子了......
while(n)
{
if(n&1)
ans*=base;
base*=base;
n>>=1;
}
if(m==0)
ans=1/ans;
return ans;

}
};

AC的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
public:
double myPow(double x, int n) {
long long f=n; //将n转化为long long 类型,之后只需将n改为f就可以了
double ans=1;
double base=x;
int m=1;
if(x==1)
{
return 1;
}
if(x==-1)
{
if(f%2==0)
return 1;
else
return -1;
}
if(f==0)
return 1;
if(f<0)
{
m=0;
f*=-1;
}
while(f)
{
if(f&1)
ans*=base;
base*=base;
f>>=1;
}
if(m==0)
ans=1/ans;
return ans;

}
};

这道题我觉得就是考察细节问题……在看2019年ICPC直播的时候听杜老师说了一句:多刷题,刷好题,刷难题。

相信总有一天你会成功de,😄嘻嘻

CATALOG