leetcode -50. Pow(x, n) Accepted
前言:其实之前自己也有了解关于算法数据结构的一点内容,但是都是用相应的开发工具来写相应的代码,今天面试的时候直接leetcode来写代码,还是用的体内根深蒂固的C和Java来解的题,毕竟目前没见支持Objective-C,Swift 总不写又生疏,,,还有自己不知道如何打断点调试这一点感觉很难受;之前没有用过的同志注意一下,这个工具我在使用的过程中,不会用。。。感觉很是尴尬😓,不知道自己写的内容应该怎么调用,当自己用C来解题的时候写上相应的main()函数来调用的时候,发现提示main() 函数重复定义,这,,,其实自己试过之后会发现自己不用写相应的调用,leetcode会给你调用的。。。呃呃呃
先闲聊几句吧,今天的面试好正式的感觉,几个人一齐面,还有微信语音通话的一端也在参与,还好不是太紧张,这也表明公司对招进来的人的重视程度吧。感谢今天的美女中午的时候还请吃的加肉加鸡蛋的牛肉面,感动的内牛满面,以后有机会的话这顿饭肯定请回来。
步入此博客主题:
记录一个题目:50. Pow(x, n) 的代码过程
惭愧当时写的时候很多东西都没有注意到。也没想到,又不能上网查,,自己只有一些思想的东西还是残缺思想
50. Pow(x, n):https://leetcode.com/problems/powx-n/description/
Implement pow(x, n).
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交流群欢迎你的加入!
群二维码:
先写到这么多
如有问题,敬请指正;
如需转载,请注明出处,谢谢!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步