實現函式double power(double base, int exponent)
,求base
的exponent
次方。不得使用庫函式。同時不需要考慮大數問題。
此題**於《劍指offer》面試題這個題很具魔性,你準備好了嘛?
前方高能!!!快快對號入座吧!
小夥伴,你是否覺得這道題很簡單?於是在三十秒內寫出了下列的**:請對號入座
double
mypow
(double x,
int n)
return ans;
}
或者:
double
mypow
(double x,
int n)
(。・∀・)ノ゙嗨,小夥伴,是你嘛?
面試官:我好像沒有說n一定為正數吧?
於是你重整旗鼓,又在三十秒內寫出了下列**:請對號入座
double
mypow
(double x,
int n)
return n>
0?ans:
1/ans;
}
或者:
double
mypow
(double x,
int n)
(。・∀・)ノ゙嗨,小夥伴,是你嘛?
面試官:我好像也沒說x不可以為0吧?
恍然大悟的你,開始思索,如果0傳入就沒有意義了呀?我怎樣處理呢?
於是忽然發現了什麼,雖然沒有意義,但我們也要象徵性的表示我們考慮了這個值吧?我們可以返回0,於是寫出了下面的**:
double
mypow
(double x,
int n)
return n>
0?ans:
1/ans;
}
或者:
double
mypow
(double x,
int n)
感覺已經完全考慮到了所有的情況,應該是沒問題了,然後開始暗暗的責怪自己,怎麼這麼簡單的問題這麼不小心。
面試官:給你一組資料,自己測試一下: 0.00001 2147483647
這,,不是說不需要大數問題嗎??
這其實好像也是int
型的最大範圍,嚴格意義上應該也不算是大數問題。
先執行一下…
已崩潰,說明是演算法的問題,需要對演算法進行優化,怎麼優化呢?
細細想來,這個o(n)
好像真的沒辦法優化了,又不能使用庫函式。
我們仔細觀察一下冪運算的過程,如果計算3
的50
次冪,怎麼辦呢?
做50
次乘法肯定是最差的想法,可不可以優化一下呢?
如果我們計算3^25 * 3^25
,然後再計算3^12 * 3^12 *3
,這樣計算是不是會少很多運算量呢?
仔細想想,時間複雜度已經降低為了o(logn)
。
思路是這樣的:
有了這條思路,於是寫出下面的**:
double
mypow
(double x,
int n)
while
(n >0)
return ans;
}
或者:
double
mypow
(double x,
int n)
return
topow
(x,n);}
double
topow
(double x,
int n)
這次應該沒有問題了,演算法已經優化得比較好了。
面試官:再給你一組資料:2.00000 -2147483648,測試一下
執行一下,咦,出錯了,這,,仔細思考一下。。。
原來是int
的邊界值忽略了,負邊界轉向正邊界時,會溢位,呀,真不小心,感覺補出下面的**:
double
mypow
(double x,
int n)
while
(exp >0)
return ans;
}
或者:
double
mypow
(double x,
int n)
return
topow
(x,exp);}
double
topow
(double x,
long n)
這個應該再沒有可以挑剔的地方了,是的,應該完全沒有了,對的。
仔細想想,好像沒有犯什麼錯誤了,把**看過來看過去,看過來看過去,不可能有錯啊。
崩潰的邊緣,終究是乙個人抗下了所有。
無奈,彷徨,生無可戀…
你是怎麼判斷兩個數相等的?
小朋友,你是否有很多問號???
噢噢,終於發現了,原來,原來,原來,原來double
不能用==
判斷,原因是計算機的小數都是不準確的,只能精確到一定數值,所以,當兩數之差小於精確值,我們就可以認定相等了。
恍然大悟。
double
mypow
(double x,
int n)
while
(exp >0)
return ans;
}
時間複雜度: o(logn)
空間複雜度:o(1)
double
mypow
(double x,
int n)
return
topow
(x, exp);}
double
topow
(double x,
long n)
時間複雜度:o(logn)
空間複雜度:o(logn)
真實的面試其實並不是有這麼多的機會,有可能你的一下失誤,瞬間失去了面試官對你的興趣,所以,思維變得完善起來吧!
我們將其中得到的啟示提取出來:
atfwus --writing by 2020–03–27
程式設計題 數值的整數次方
題目描述 給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。保證base和exponent不同時為0 我的思考 1 如果次方是正樹,即直接迴圈累乘即可 2 如果次方是0的話,任何數的0次方都是1 3 如果次方是小於0的數的話,則在迴圈的時候...
每天一道劍指offer 數值的整數次方
給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。首先要把所有的情況都考慮在內,比如基數和指數為0的情況,指數為負數的情況。然後說一下一種比較優的思路,比如乙個數的32次方,它與這個數16次方的平方相等,依次類推,求乙個數的32次方只需做5...
數值的整數次方
題目 實現函式double power double base,int exponent 求base的exponent次方。不得使用庫函式,同時不需要考慮大樹問題。這道題目有以下幾點需要注意 0的0次方是無意義的,非法輸入 0的負數次方相當於0作為除數,也是無意義的,非法輸入 base如果非0,如果...