笔试题63. LeetCode OJ (50)
Posted _从未止步
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔试题63. LeetCode OJ (50)相关的知识,希望对你有一定的参考价值。
这个题让我们自己实现一个 pow(x,y) 函数,看起来简简单单的一个函数,我相信绝对可以难倒一片人的,因为我们很难将它"写对"。我之前其实也见过这个题的,在剑指offer上就出现过了,我感觉我写这个算法没有问题的,我考虑了很多方面而导致程序看起来比较的乱,最终修改了好几次才正确。
我个人感觉这个题比较重要的一点是 pow(x,y) 的功能的处理比凸显代码能力吧,首先比如: pow(3,10) 难道我们要使用循环10次的方法一个一个的乘吗?当然不能这样我给你个 pow(3,1000) , pow(3,10000) 这些难道我们都是用循环一个一个的乘?显然不是。
另外我在提交的时候发现了一个问题,就是当指数为 -2147483648 的时候,我们该怎么处理这种情况呢?我当时没有考虑这个问题的,但是提交的时候暴露出来了,例如 pow(-1,-2147483648) ,它的结果是多少呢? 答案是 1 ,而pow(2,-2147483648) 的值为0,但我个人觉得有点不妥(我考虑的是int类型的范围),大家也可以提出质疑。我在代码中给出了一些注释,可以看出来哪些细节需要注意,大家可以参考一下。
class Solution {
public:
double myPow(double x, int n)
{
/*
-2147483648到底算正数还是负数
x=-1 n=-2147483648 >> 1
x=2 n=-2147483648 >> 0
*/
//指数为0, 0^0 = 1
if (n == 0)
{
return 1;
}
//注意double与0的比较
if (x <= 0.00001 && x > (-0.00001) )
{
return 0;
}
//底数为1或-1
if(x==-1 || x==1)
{
if(n%2==0 && x==-1)
{
return -x;
}
return x;
}
//指数为1
if (n == 1)
{
return x;
}
//无效输入的情况,(-3)^(-3)无效
if (n < 0 && x < 0 && n % 2 != 0)
{
return 0;
}
if (n == (int)pow(2,31))
{//底数不为1或-1的时候,该值的结果应该返回0,但是个人感觉该值没有什么意义
return 0;
}
double value = 0;
bool isminusN = false; //指数的正负
if (n < 0)
{// n为负数
isminusN = true;
n *= -1;
}
//获取指数运算的结果
value = getNum(x, n);
//n为偶数时
if (isminusN)
{//指数为负数
return 1 / value;
}
else
{//指数为正数
return value;
}
}
double getNum(double x,int n)
{
if (n == 1)
{
return x;
}
if (n == 2)
{
return x*x;
}
return getNum(x, n / 2)*getNum(x, n - (n / 2));
}
};
最后的结果是通过了,这种题给我们的启示就是我们需要很细心的去思考,并注意一些易错的问题。
以上是关于笔试题63. LeetCode OJ (50)的主要内容,如果未能解决你的问题,请参考以下文章