前言:其實之前自己也有了解關於算法數據結構的一點內容,但是都是用相應的開發工具來寫相應的代碼,今天面試的時候直接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交流群歡迎你的加入!
群二維碼:
先寫到這么多
如有問題,敬請指正;
如需轉載,請注明出處,謝謝!