笔试题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)的主要内容,如果未能解决你的问题,请参考以下文章

笔试题56. LeetCode OJ (43)

笔试题57. LeetCode OJ (44)

笔试题61. LeetCode OJ (48)

笔试题55. LeetCode OJ (42)

笔试题65. LeetCode OJ (52)

笔试题54. LeetCode OJ (41)