剑指offer-12、数值的整数次方

题⽬描述

给定⼀个 double 类型的浮点数 base 和 int 类型的整数 exponent 。求 base 的exponent 次⽅。保证 base 和 exponent 不同时为 0 。

示例1: 输⼊:2.00000,3 返回值:8.00000

示例2: 输⼊:2.10000,3 返回值:9.26100

思路及解答

暴力求解

如果使⽤暴⼒解答,那么就是不断相乘,对于负数⽽⾔,则是相除,并且符号取反。

java 复制代码
public class Solution {
	public double Power(double base, int exponent) {
		if (exponent < 0) {
			base = 1 / base;
			exponent = -exponent;
		}
		double result = 1.0;
		for (int i = 0; i < exponent; ++i) {
			result *= base;
		}
		return result;
	}
}

拆解递归

题⽬中的 double 类型不能拆解,但是 int 类型的整数 exponet 可以做点⽂章,我们平时求次⽅的时候,假设有个 x 的 4 次⽅,我们通常是求出⼀个 x 的平⽅数 x^2 ,然后两个 x^2相乘就可以得出 x^4 。

对于xⁿ,可以分解为:

  • 如果n为偶数:xⁿ = xⁿ/² * xⁿ/²
  • 如果n为奇数:xⁿ = x * xⁿ/² * xⁿ/²

这⾥思路也⼀样,使⽤递归,同时考虑边界条件。如果指数是负数,则先取反,最后取结果的倒数即可。

java 复制代码
public double Power(double base, int exponent) {
    if (exponent == 0) {
        // 指数为0则直接返回1
        return 1;
    }
    
    if (base == 0) {
        //底数为0直接返回0
        return 0;
    }
    
    // 判断指数是否为负数
    boolean isNegative = false;
    if (exponent < 1) {
        exponent = -exponent;
        isNegative = true;
    }
    
    double result;
    if (exponent % 2 == 1) {
    	result = base * Power(base, exponent - 1);
    } else {
        double temp = Power(base, exponent / 2);
        result = temp * temp;
    }
    return isNegative ? (1.0 / result) : result;
}
  • 时间复杂度: O(logn) ,每次计算后规模缩⼩⼀半
  • 空间复杂度: O(logn) ,递归的时候,栈需要⽤到变量

迭代快速幂算法

将指数表示为二进制形式,通过位运算减少乘法次数。例如,计算3¹³(1101₂)可以分解为3⁸ * 3⁴ * 3¹。

java 复制代码
public double power(double base, int exponent) {
    if (exponent == 0) {
        // 指数为0则直接返回1
        return 1;
    }
    
    if (base == 0) {
        //底数为0直接返回0
        return 0;
    }
    
    long exp = Math.abs((long)exponent);
    double result = 1.0;
    
    while (exp > 0) {
        if ((exp & 1) == 1) { // 当前二进制位为1
            result *= base;
        }
        base *= base; // 平方
        exp >>= 1; // 右移一位
    }
    
    return exponent > 0 ? result : 1.0 / result;
}

Java标准库

java 复制代码
public double power(double base, int exponent) {
    if (exponent == 0) {
        // 指数为0则直接返回1
        return 1;
    }
    
    if (base == 0) {
        //底数为0直接返回0
        return 0;
    }
    
    return Math.pow(base, exponent);
}
相关推荐
摇滚侠2 分钟前
Spring 零基础入门到进阶 入门 06-10
java·spring·intellij-idea
要开心吖ZSH5 分钟前
AI医疗分诊与健康咨询助手agent开发——(1)从零搭建SpringBoot与AI对话系统:后端骨架 + 前端对话页 + SSE流式输出
java·ai·agent·健康医疗
biubiubiu07067 分钟前
SpringBoot生产级日志配置
java·spring boot·后端
ch.ju16 分钟前
Java Programming Chapter 4——Inherited call
java·开发语言
是有头发的程序猿19 分钟前
竞品分析 + 用户洞察自动化|基于 item_review 评论接口 + 多 AI Agent 实现淘宝评论全量采集与智能分析(附python源码)
java·python·自动化
凤凰院凶涛QAQ25 分钟前
《Java版数据结构 & 集合类剖析》链表与LinkedList:节点手拉手,增删不用愁
java·数据结构·链表
唐青枫37 分钟前
Java MyBatis 实战指南:XML 映射、动态 SQL 与数据访问层设计
java·mybatis
码语智行37 分钟前
MQTT 配置、依赖与使用说明
java·物联网·mt
_日拱一卒38 分钟前
LeetCode:39组合总和
java·算法·leetcode·职场和发展
郝学胜-神的一滴40 分钟前
力扣 662 :二叉树最大宽度
java·数据结构·c++·python·算法·leetcode·职场和发展