인터뷰 질문 11 : 이중 기본 형식 및 부동 소수점 int 형 정수 지수를 감안할 때. 전원 염기의 지수를 찾는.
문제 해결 아이디어
思路1:brute force 累乘法,时间复杂度O(n)
挨个乘,exponent 为 n,则累乘 n 次得出结果。
思路2:使用递归,时间复杂度O(logn)
当n为偶数,a^n =(a^n/2)*(a^n/2)
当n为奇数,a^n = a^[(n-1)/2] * a^[(n-1)/2] * a
思路3:同递归的思路,但采用循环法(递归和循环都是可以互换的)
复制代码
코드 구현
- 무력 곱셈 피곤을
public double Power(double base, int exponent) {
if(base == 0) {
return 0;
}
double result = 1.0;
int positiveExponent = Math.abs(exponent);
for(int i=1; i<=positiveExponent; i++) {
result *= base;
}
return exponent < 0 ? 1/result : result;
}
复制代码
- 재귀
public class Solution {
public double Power(double base, int exponent) {
if(base == 0) {
return 0;
}
int positiveExponent = Math.abs(exponent);
double result = PowerPositiveExponent(base, positiveExponent);
return exponent < 0 ? 1 / result : result;
}
private double PowerPositiveExponent(double base, int n){
if(n == 0) {
return 1.0;
}
if(n == 1) {
return base;
}
double result = PowerPositiveExponent(base, n >> 1);
result *= result;
if((n & 1) == 1) {
result *= base;
}
return result;
}
}
复制代码
- 라운드 로빈
public class Solution {
public double Power(double base, int exponent) {
if(base == 0) {
return 0;
}
double result = 1.0;
int positiveExp = Math.abs(exponent);
while(positiveExp != 0){
//此处判断奇数,这一步至少会走两次:
//如果是奇数,第一次就会进入这个判断。移位到最后为1时,也会进入这个判断
if((positiveExp & 1) == 1){
result *= base;
}
base *= base;
positiveExp = positiveExp >> 1;
}
return exponent < 0 ? 1 / result : result;
}
}
复制代码
개요
일반적으로, 뒤에 아이디어를 생각 할 수있는 기억. 아이디어는 이중 계산을 방지하기 위해, 중간 값을 저장하는 것입니다.
이 자연의 아이디어 "에 피보나치 알고리즘 이데올로기 보류 중간 값"동일합니다.