[LeetCode]剑指 Offer 16. 数值的整数次方

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode]剑指 Offer 16. 数值的整数次方相关的知识,希望对你有一定的参考价值。

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000

示例 2:

输入:x = 2.10000, n = 3
输出:9.26100

示例 3:

输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25

提示:

  • -100.0 < x < 100.0
  • -231 <= n <= 231-1
  • -104 <= xn <= 104

题解:


示例如下:


算法流程:

  • 当 x = 0 时:直接返回 0 (避免后续 x = 1 / x 操作报错)
  • 初始化 res = 1
  • 当 n < 0 时:把问题转化至 n ≥ 0 的范围内,即执行 x = 1 / x,n = - n
  • 循环计算:当 n = 0 时跳出:
    1. 当 n & 1 = 1 时:将当前 x 乘入 res
    2. 执行 x = x2
    3. 执行 n 右移一位(即 n >>= 1)
  • 返回 res
    /**
     * 剑指 Offer 16. 数值的整数次方
     */
    public double myPow(double x, int n) 
        if (x == 0) 
            return 0;
        

        long b = n;
        double res = 1.0;

        // 将负数次幂转换为正数方便运算
        if (b < 0) 
            x = 1.0 / x;
            b = -b;
        

        /*
         * 当 x = 2,b = 5 = 0101 时,
         * 第一轮循环:b=0101, b&1=1, res = 2, x=4
         * 第二轮循环:b=010,  b&1=0, res = 2, x=16
         * 第三轮循环:b=01,   b&1=1, res = 32,x=256
         */

        while (b > 0) 
            // 二进制数 b 的最后一位是否为 1
            if ((b & 1) == 1) 
                res *= x;
            
            x *= x;
            b >>= 1;
        
        return res;
    

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/shu-zhi-de-zheng-shu-ci-fang-lcof

以上是关于[LeetCode]剑指 Offer 16. 数值的整数次方的主要内容,如果未能解决你的问题,请参考以下文章

算法---- Leetcode剑指offer-Java版题解

算法---- Leetcode剑指offer-Java版题解

力扣(LeetCode)剑指offer刷题笔记(java),已完结!!!

力扣(LeetCode)剑指offer刷题笔记(java),已完结!!!

[LeetCode]剑指 Offer 20. 表示数值的字符串

LeetCode(剑指 Offer)- 20. 表示数值的字符串