leetcode -50. Pow(x, n) Accepted

  前言:其实之前自己也有了解关于算法数据结构的一点内容,但是都是用相应的开发工具来写相应的代码,今天面试的时候直接leetcode来写代码,还是用的体内根深蒂固的C和Java来解的题,毕竟目前没见支持Objective-C,Swift 总不写又生疏,,,还有自己不知道如何打断点调试这一点感觉很难受;之前没有用过的同志注意一下,这个工具我在使用的过程中,不会用。。。感觉很是尴尬😓,不知道自己写的内容应该怎么调用,当自己用C来解题的时候写上相应的main()函数来调用的时候,发现提示main() 函数重复定义,这,,,其实自己试过之后会发现自己不用写相应的调用,leetcode会给你调用的。。。呃呃呃

先闲聊几句吧,今天的面试好正式的感觉,几个人一齐面,还有微信语音通话的一端也在参与,还好不是太紧张,这也表明公司对招进来的人的重视程度吧。感谢今天的美女中午的时候还请吃的加肉加鸡蛋的牛肉面,感动的内牛满面,以后有机会的话这顿饭肯定请回来。

步入此博客主题:

  记录一个题目:50. Pow(x, n) 的代码过程

惭愧当时写的时候很多东西都没有注意到。也没想到,又不能上网查,,自己只有一些思想的东西还是残缺思想

Implement pow(xn).

Example 1:

Input: 2.00000, 10
Output: 1024.00000

Example 2:

Input: 2.10000, 3
Output: 9.26100

double myPow(double x, int n) {}

  • 根据题目再加上给出的函数的返回参数和参数 我的理解是是要
  • 我们实现一个myPow函数,这个函数有两个参数,x标识底数,n标识指数,计算出结果,返回这个结果
  • 有这么几点注意事项:
    • 1.传入的x是double类型的
    • 2.传入的n是整数,她可能是负数
    • 负数的情况可以加绝对值,然后,得到中间结果midResult,还得用1.0/midResult
    • 负数加绝对值还要考虑,是否是INT_MIN ,否则存在越界的问题
    • 下边展示出来我在leetcode上Accepted的代码(这个代码Accepted是自己回家查询后才解决的)

上代码之前写几个小点:

#include <limits.h> : 导入limits.h 是为了使用INT_MIN

abs()加绝对值使用 leetcode中不需要导入头文件,不过最好还是注意一下:

 

#include <stdlib.h> //整数的abs求值的时候需要导入的头文件

 

#include <math.h> //浮点数的abd求值的时候需要导入的头文件

 

 

 

有的时候用leetcode可能Run的结果不对,这个时候,可以重新刷新一次,放心写的内容还在

函数内部最开始可能我们写的内容比较简单:

1 //阶乘结果的初始值
2 double sum = 1.0;
3 //开始的时候写的比较简单
4 for(int i = 0;i < abs(n);i ++)
5 {
6   sum *=x;
7 }
8 return n > 0 ? sum : 1.0/sum;

 

在leetcode中这个只限制于能够实现功能,但是不能够Accept

减少时间复杂度的层面上来看要用到递归二分的思想(这个都是今天的面试官引导到的)

解决了时间复杂度的问题后,还有一个问题在等着我们就是上边有提及到的INT_MIN

下边展示Accepted的代码

 1 #include <limits.h>
 2 
 3 double myPow(double x, int n) {
 4     
 5     //阶乘结果的初始值
 6     double sum = 1.0;
 7     
 8     if(n == 0){
 9         //避免除以0 的情况 Runtime Error 
10         return 1;
11     }
12     
13     if(n == INT_MIN){
14         //避免 INT_MIN 的相反数越界的问题
15         
16         ++ n;
17         n = -n;
18         
19         // 后边又乘了两个x是因为上边的abs(n) 本来应该是偶数的,但是自己做了处理后相当于少了2个x
20         sum *= myPow(x*x,abs(n)/2) *x * x;
21         
22         return 1.0/sum;
23     }
24 
25     if(n%2 ==0){
26         //避免超时 有二分和递归的思想 加abs绝对值是因为总爱有一个34.0005 的-3次方的问题出现
27         sum = myPow(x*x,abs(n)/2);
28     }else{
29         sum *= myPow(x*x,abs(n)/2) * x;
30     }
31     
32     return n > 0 ? sum : 1.0/sum;
33 } 

 

贴图证明:

其实这里边有两个数是搞不大明白的

我打印了一下(-2)的31次方是-2147483648

2的31次方(2<<30)减去1是2147483647

2的31次方(2<<30)这个值是1000 0000 0000 0000 0000 0000 0000 0000 ;打印出来这个值是

-2147483648

记得之前学习计算机组成原理的时候,有一点印象是首位是符号位 1为负数的意思,可能是这个原因导致的她是负数吧。。

暂且不去查了,,,,

 

参考网址:

https://leetcode.com/problems/powx-n/discuss/

http://blog.csdn.net/wujumei1962/article/details/44104895

http://blog.csdn.net/booksyhay/article/details/12164897

 

iOS交流群欢迎你的加入!

群二维码:

先写到这么多

如有问题,敬请指正;

如需转载,请注明出处,谢谢!

 

 

 

posted on 2017-11-22 21:56  ITCoderW  阅读(1210)  评论(2编辑  收藏  举报

导航