题解 | #数值的整数次方#

数值的整数次方

http://www.nowcoder.com/practice/1a834e5e3e1a4b7ba251417554e07c00

算法思想一:直接暴力法

解题思路:

将 exponent 分为正 负数,当为负数时将 exponent 转为正数,并采用循环计算 exponent 次幂,然后将结果转为其倒数
当为正数时,可直接采用循环计算 exponent 次幂

代码展示:

# -*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        # write code here
        result = 1
        # 如果base为0
        if base == 0:
            return 0
        # 如果exponent为0,则为0
        if exponent == 0:
            return 1
        # 如果exponent为负数,则将其转化为整数计算结果求倒数
        if exponent < 0: for i in range(-exponent): result = result * base return 1/result # 循环计算exponent 次方 for i in range(exponent): result = result * base return result

复杂度分析:

时间复杂度O(N):循环计算只需要根据 exponent 的大小
空间复杂度O(1):需要常数级空间

算法思想二:递归

如果exponent == 0,返回1
如果exponent < 0,最终结果为 1 / x^{-n}
如果exponent为奇数,最终结果为 x * x ^ {n - 1}
如果exponent为偶数,最终结果为 x ^ {2*(n/2)}

代码展示:

public class Solution {
    public double Power(double base, int exponent) {
        //如果exponent等于0,直接返回1
    if (exponent == 0)
        return 1;
    //如果exponent小于0,把它改为正数
    if (exponent < 0) return Power(1 / base, -exponent); //根据exponent是奇数还是偶数来做不同的处理 递归 return (exponent % 2 == 0) ? Power(base * base, exponent / 2) : base * Power(base * base, exponent / 2); } }

复杂度分析:

时间复杂度:O(logn):其中n表示exponent
空间复杂度:O(logn)

算法思路三:位运算

算法思想:
循环遍历exponent的每一位
循环的过程中,让base做乘方运算
若当前最低位为1,则将res乘以当前base的值
最后若 exponent 为负数,则将结果转为倒数 

代码展示:

class Solution {
    public double Power(double base, int exponent) {
        double res = 1.0;
        for (int i = exponent; i != 0; i /= 2) {
            if ((i&1) == 1) {
                res *= base;
            }
            base *= base;
        }
        if (exponent < 0) {
            res = 1 / res;
        }
        return res;
    }
}

复杂度分析:

时间复杂度O(logN):N为exponent
空间复杂度O(1):常数空间

全部评论

相关推荐

2025-12-06 01:10
已编辑
哈尔滨工程大学 Java
一面问的真细,二面不知为啥变双机位。9.29快手主站平时怎么学习&nbsp;AI&nbsp;的,国内外知名大模型,实习公司都用的什么大模型,怎么评估效果的java池化思想,线程池构造方法的核心参数,线程池中阻塞队列注意事项,submit方法参数和执行逻辑,shutdown和shutdownnow,核心线程允许过期吗threadlocal底层,为什么key是弱引用,key回收了再get或者set这个value会怎样aqs,如何保证公平性java代理java堆划分,新生代还有别的晋升老年代的情况吗,什么时候触发gc,gc失败抛什么异常,如何排查oom,导出dump命令redis数据结构,哪个底层是跳表,和其他数据结构对比布隆过滤器会出现大key问题吗,你咋实现的布隆过滤器你怎么实现redis分布式锁,可重入,续期聚簇索引非聚簇索引select语句会加锁吗,怎么实现的不加锁undolog&nbsp;redolog&nbsp;binlog怎么能让select加锁,update这个范围加的什么锁,update一条呢手撕简单01背包,接雨水10.10快手主站意图识别用的哪个大模型,走到意图和rag的比例,faq是点击的吗自然语言怎么识别的gap一年干啥了,转正怎么样没跟组里提意向吗,研究生研究方向是传统算法吗,会大模型微调吗注册场景为什么用布隆过滤器,原理分布式锁底层的key怎么拼的,value里是什么redis持久化zset底层mysql索引结构,一个表三个字段有主键唯一索引和没索引的字段会有几个b+树,聚簇索引非聚簇索引存的啥无手撕
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务