剑指Offer(第二版)面试题16:数值的整数次方



(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/73368916冷血之心的博客)


剑指Offer(第二版)面试题16:数值的整数次方


题目:请实现一个函数,功能类似与Math.power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题



思路:该题主要考察代码的完整性,即必须考虑底数为0和指数为负数的情况,力求写出完整的代码。
在方法2中我们使用了递归的思路,即从下到上依次计算。相求16次方,则先求8次方,先求4次方。。。

/**
 * 剑指Offer(第二版)面试题16:数值的整数次方
 * 题目:请事先一个函数,功能类似与Math.power(double base, int exponent),
 * 求base的exponent次方。不得使用库函数,同时不需要考虑大数问题
 * @author ywq
 */
public class Main {
	public static void main(String[] args) {
		System.out.println(PowerEst(2, 4));
	}
	/**
	 * 方法1:常规解法,时间复杂度为O(N)
	 * @param base
	 * @param exponent
	 * @return
	 */
	public static double Power(double base, int exponent) {
	      if(base==0)    	 
			  return 0;
	      double result = 1.0;
    	  for(int i = 1;i<=Math.abs(exponent);i++){
	    	  result *= base;
	      }
    	  return exponent>0?result:1/result;
	}
	/**
	 * 方法2:递归解法,时间复杂度为O(logN)
	 * @param base
	 * @param exponent
	 * @return
	 */
	public static double PowerEst(double base, int exponent) {
	   if(base==0)
		   return 0;
	   int n=Math.abs(exponent);
       if(n==0)
           return 1;
       if(n==1)
           return base;
       double  result=PowerEst(base,n>>1);
       result*=result;
       if((n&1)==1)
           result*=base;
       if(exponent<0)
           result=1/result;
       return result;   
	}
}


细节问题:

(1)方法2 中使用了右移运算符代替了除以2,效率高

(2)方法2 用位与运算代替了求余运算符(%)来判断一个数是奇数还是偶数



如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~

本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。





你可能感兴趣的:(笔试题,面试题,剑指Offer)