Leecode50 Pow(x,n)

@[TOC](Leecode50 Pow(x,n))

题目:

50:实现 pow(x, n) ,即计算 x 的 n 次幂函数。

思路:

  1. 使用库函数,但一般都要求不这么做,失去了题目的价值了;

  2. 循环暴力乘,时间复杂度O(n);

  3. 5^4实际上等于 15^2,以此思想实现时间复杂度为O(logN)的解法;

第三思路详细分析:

  1. 注意N为负数的时候应该将N变成正数,并且x = 1/x;

  2. 如果N为偶数,则x = x*x, n= n / 2, 除2操作可考虑使用位运算 n>>= 1;

  3. 如果N为奇数,则x=x*x,n >>=1;且在此基础上再乘以x即可;

代码实现:

1,递归实现:

class Solution {
	public double myPow(double x, int n) {
     	    long absn = n // 当n为-2147483648时,单纯的n=-n已经不行了,溢出了;
	    if(absn < 0){
		    x = 1 / x;
		    absn = -absn;
	    }
	   if(absn == 1)return x;
	   if(absn == 0) return 1;
	   if((absn & 1) == 1){
		return x * myPow(x*x, absn >>> 1);
	   } else {
	        return myPow(x*x, absn >>> 1);
	   }
     }
}

2 循环实现:

class Solution {
public double myPow(double x, int n) {
	long absn = n; // 当n为-2147483648时,单纯的n=-n已经不行了,溢出了;  
	if(absn < 0){     
		x = 1 / x;    
		absn = -absn;
	}
	double sum = 1.0;
	while(absn > 0){ 
		if((absn & 1) == 1){ 
               	 sum *= x;     
		}
		absn >>>= 1;
		x *= x;
	}
	return sum;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值