對於一些球指數冪、開方等函數經常會出現在筆試面試中。
50. Pow(x, n)
題目描述:
Example 1:
Input: 2.00000, 10 Output: 1024.00000
Example 2:
Input: 2.10000, 3 Output: 9.26100
題目解析:
1. 本題是想求:一個double數的整數次冪的庫函數。
2. 最簡單的方法是設置一個for循環,依次乘以給定的double,知道次數滿足給定冪整數,如果是負數結果求導數就行。但是比較慢。
3. 比較好的做法是:每次都在當前結果上面求平方。這個時間複雜度就低了,看代碼:
代碼如下:
class Solution {
public:
double myPow(double x, int n)
{
if(n == 0)
return 1;
double half = myPow(x, n/2);
// 如果n是偶數
if(n%2 == 0)
return half*half;
// n是大於0的奇數
else if(n > 0)
return half*half*x;
// n是小於0的奇數
else
return half*half*(1/x);
}
};
69. Sqrt(x)
題目描述:
Implement int sqrt(int x)
.
Compute and return the square root of x.
x is guaranteed to be a non-negative integer.
Example 1:
Input: 4 Output: 2
Example 2:
Input: 8 Output: 2 Explanation: The square root of 8 is 2.82842..., and since we want to return an integer, the decimal part will be truncated.
題目解析:
代碼如下:
class Solution {
public:
// 使用二分法求解,爲了防止溢出。定義變量爲unsigned long long類型
int mySqrt(int x)
{
if(x == 0 || x== 1)
return x;
unsigned long long start = 0;
unsigned long long end = x;
while(start < end)
{
unsigned long long mid = start + (end-start)/2;
unsigned long long res = mid*mid;
if(res == x)
return mid;
else if(res > x)
end = mid;
else
start = mid;
if(end -start == 1)
break;
}
return start;
}
};