【劍指offer】面試題16. 數值的整數次方

解題思路

本道題目做了很久才通過,感覺有很多的坑等着自己。
首先剛拿到手,覺得題目很簡單,開始時,分了兩種情況(指數爲正和負)+一些特殊情況(底數爲0,指數爲0)在做
但運行過程中,仍然有報錯,第一個錯誤時n=-2147483648時的錯誤,剛開始沒有反應過來,後來通過題意,纔想明白,自己平時做題也沒有去考慮過int型的範圍,
在n=-2147483648時,由於我先轉換成了abs(n),而正數n最大值爲2147483647,因此報錯。
第二個遇到的問題是,總是運行超時,一開始我寫的pow()函數,是一般的循環算法,但是進行運行測試發現需要2700多ms,所以這種方法不行;
image.png
劍指offer中的公式
參考了劍指offer中的轉換爲遞歸的思路,
n爲偶數,pow(8)=pow(4)*pow(4),pow(4)=pow(2)*pow(2),pow(2)=pow(1)*pow(1)
n爲奇數,pow(9)=pow(4)*pow(4)*base,pow(4)=pow(2)*pow(2),pow(2)=pow(1)*pow(1)
在其編寫的代碼中,也瞭解到通過異常捕獲,使程序魯棒性更強,通過位運算,能實運行速度更加地快(B格也高了不少);
總之,學習了。

代碼

class Solution {
public:
#define EPSILON 0.000001 //根據精度需要進行調整
	bool g_InvalidInput = false;
	double myPow(double x, int n) {
		//基數爲0且指數<0
		if (fabs(x - 0.0) < EPSILON && n <= 0)
		{
			g_InvalidInput = true;
			return 0.0;
		}
		//如果指數爲負時,爲臨界值時,要特殊處理
		if (n == -2147483648) {
			return 1.0 / (x * Pow(x, abs(n + 1)));
		}
		else
		{
			int absN = abs(n);
			//指數<0,返回其倒數
			return n > 0 ? Pow(x, absN) : 1.0 / Pow(x, absN);
		}

	}
	double Pow(double base, int e)
	{
		if (e == 0) return 1;
		if (e == 1) return base;
		//右移1位,相等於/2,位運算速度更快
		double result = Pow(base, e >> 1);
		result *= result;
		//如果指數爲奇數,根據公式,最後還要*base
		//此處判斷奇數,通過與1相與,速度更快
		if (e & 0x1 == 1) result*= base;
		return result;
	}
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章