劍指offer之面試題11 數值的整數次方

2021-07-11 08:37:37 字數 2805 閱讀 5391

題目描述

給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。

思路:這道題看似很簡單,習慣性地認為用乙個迴圈,不斷乘以base,即可:

public

double

power(double

base, int exponent)

return result;

}

但是,忽略了一下幾種情況:

case1:指數為負數

case2:指數為負數且底數為0

case2:指數為0,底數也為0

修改**如下,已在牛客網提交:

public

class solution

return result;

*///以上**有什麼問題?

//1 exponent<1,即為0或負數,怎麼辦?求exponent絕對值,然後求倒數

//2 base=0,expronent<0,即分母為0,處理有三種:返回值,全域性變數,異常

//3 double base;base==0.0,帶有小數的比較

//4 0的0次方,定義

//現在對以上**進行改進

if(equal(base,0.0)&&exponent<0)

int ab***ponent=exponent;

if(exponent<0)

double result=powerwithunsignedexponent(base,ab***ponent);

if(exponent<0)

return result;

} public

static

double

powerwithunsignedexponent(double

base, int exponent)

return result;

}public

static boolean equal(double

base,double zero)

else

}public

static

void

main(string args)

}

note:

三點一,public

static boolean g_invalidinput=false;有什麼用?

因為在第三種情況,會出現異常,故在呼叫這個函式時,需要判斷或對異常進行預判處理。返回值無法區分這一異常情況,因為出錯了返回0,但也有可能是0^0,所以加上了乙個全域性變數,當出錯時,全域性遍歷為true,呼叫的時候可以檢查一下這個全域性變數的值。

二,在判斷底數是否等於0時,不是用base==0判斷,而是另外寫了乙個函式,有必要嗎?

有必要,double型數值在計算機內的表示有誤差,小數之間判斷是否相等,不能簡單用==來判斷,有意義的相等應該是相差小於某個足夠小的數。

三,public

static

double

powerwithunsignedexponent(double

base, int exponent)這個函式能否改進效率,o(logn)

乙個公式:見下圖

牛客網提交**:

public

class solution

return result;

*///以上**有什麼問題?

//1 exponent<1,即為0或負數,怎麼辦?求exponent絕對值,然後求倒數

//2 base=0,expronent<0,即分母為0,處理有三種:返回值,全域性變數,異常

//3 double base;base==0.0,帶有小數的比較

//4 0的0次方,定義

//現在對以上**進行改進

if(equal(base,0.0)&&exponent<0)

int ab***ponent=exponent;

if(exponent<0)

double result=powerwithunsignedexponent(base,ab***ponent);

if(exponent<0)

return result;

} public

static

double

powerwithunsignedexponent(double

base, int exponent)

*///a^n=a^(n/2)*a^(n/2),n為偶數

//a^n=a^((n-1)/2)*a^((n-1)/2)*a,n為奇數

if(exponent==0)

if(exponent==1)

double result=powerwithunsignedexponent(base,exponent>>1);//>>1等價於除以2

result=result*result;

if((exponent&1)==1)

return result;

}public

static boolean equal(double

base,double zero)

else

}public

static

void

main(string args)

}

note:

右移代替除以2,&代替`%

`判斷是否奇數偶數,效率更高

劍指offer面試題11

面試題1 數值的整數的次方 題目 實現函式double power double base,int exponent 求base的 exponent次方。不得使用庫函式,同時不需要考慮大數問題。思路 首先應該明確指數的可能取值 正整數,0,負整數 另外還需要考慮底數是0的情形。對於負整指數,我們可以...

劍指offer之面試題9 4 矩形覆蓋

題目描述 我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?思路 用數學歸納的思想分析,得出規律。牛客網提交 public class solution if target 2 return init target int...

劍指offer之面試題11 旋轉陣列的最小數字

1 題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如 陣列為的乙個旋轉,該陣列的最小值為1。輸入引數 一維陣列numbers,陣列長度length 輸出引數 最小元素的值,或者丟擲 傳入引數錯誤 的異常 2 解題 ...