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交流群歡迎你的加入!

群二維碼:

先寫到這么多

如有問題,敬請指正;

如需轉載,請注明出處,謝謝!

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM