LeetCode 剑指offer 16 数值的整数次方

题目:
题目
数值范围:
数值范围
拿着这道题啊,不要多说话上来就是判断一下正负,然后x**n

public double myPow(double x, int n) {
        if (n == 0) {
            return 1.0f;
        }
        boolean tag = n < 0;
        n = Math.abs(n);
        double temp = x;
        for (int i = 1; i < n; i++) {
            x *= temp;
        }
        return tag ? 1 / x : x;
    }

很明显啊O(n)了,直接超时,好了,是时候打开题解,康康大佬们怎么做的,嘿嘿🤭,直接上代码!!!

public static double myPow(double x, int n) {
        // 等于0就直接返回0, ok吧
        if (x == 0) {
            return 0;
        }
        // 排除0任何数的0次方等于1
        if (n == 0) {
            return 1.0f;
        }
        // 将n赋值给long型变量, int 4个字节, 范围在[−2147483648,2147483647]
        // 如果为int时, n为-2147483648, 取正数, 越界
        long temp = n;
        // n 为负数, x = 1 / x, n = -n
        if (temp < 0) {
            x = 1 / x;
            temp = -temp;
        }
        double result = 1.0f;
        while (temp > 0) {
            // 当n的最后一位为1时, 赋值
            if ((temp & 1) == 1) {
                result *= x;
            }
            x *= x;
            // 将n右移一位
            temp >>= 1;
        }
        return result;
    }

总体的思路就是:

  1. 每次让x *= x,将n进行降幂,直到n<=0,
  2. 设置返回值为result,当n为奇数时,初始值为result * x,
  3. 每次n为奇数时,将result更新,每次并且将n右移一位
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值