当前位置: 首页 > article >正文

剑指 Offer(第2版)面试题 16:数值的整数次方

剑指 Offer(第2版)面试题 16:数值的整数次方

  • 剑指 Offer(第2版)面试题 16:数值的整数次方
    • 解法1:快速幂 - 递归写法
    • 解法2:快速幂 - 非递归写法

剑指 Offer(第2版)面试题 16:数值的整数次方

题目来源:27. 数值的整数次方

不得使用库函数,同时不需要考虑大数问题。

只要输出结果与答案的绝对误差不超过 10−2 即视为正确。

注意:

  • 不会出现底数和指数同为 0 的情况
  • 当底数为0时,指数一定为正
  • 底数的绝对值不超过 10,指数的绝对值不超过 109

解法1:快速幂 - 递归写法

最朴素的想法就是循环,一个一个往上乘,不过这会超时。

需要注意的是指数为负数的情况,只需要把指数取绝对值,最后结果取倒数即可。

注意指数 exponent 要转换成 unsigned int 或者 long long,有一个数据是 10, −2147483648,int 的范围是 −2147483648 ~ 2147483647,对 −2147483648 取绝对值会爆掉,转成 signed int 也会爆。

算法:

在这里插入图片描述

代码:

class Solution
{
public:
    double Power(double base, int exponent)
    {
        if (base == 0)
            return 0.0;
        if (exponent >= 0)
            return quickMul(base, (long long)exponent);
        else
            return quickMul(1.0 / base, abs((long long)exponent));
    }
    // 辅函数 - 快速幂
    double quickMul(double base, long long exponent)
    {
        if (exponent == 0)
            return 1.0;
        double y = quickMul(base, exponent / 2);
        if (exponent % 2 == 1)
            return y * y * base;
        else
            return y * y;
    }
};

复杂度分析:

时间复杂度:O(log(exponent))。

空间复杂度:O(log(exponent))。

解法2:快速幂 - 非递归写法

在这里插入图片描述

详见 Pow(x, n) - LeetCode官方题解。

代码:

class Solution
{
public:
    double Power(double base, int exponent)
    {
        unsigned int n = abs(exponent);
        double res = 1.0;
        while (n)
        {
            if (n & 01)
                res *= base;
            base *= base;
            n >>= 1;
        }
        if (exponent < 0)
            res = 1.0 / res;
        return res;
    }
};

复杂度分析:

时间复杂度:O(log(exponent))。

空间复杂度:O(1)。


http://www.kler.cn/a/157600.html

相关文章:

  • RestTemplate远程调用、服务注册、
  • 【前后端】HTTP网络传输协议
  • 源码分析之Openlayers中OverviewMap鹰眼控件
  • 跟沐神学读论文-论文阅读管理
  • unity接入coze智能体
  • 【信息系统项目管理师-论文真题】2018下半年论文详解(包括解题思路和写作要点)
  • JAVA-作业7-画一个笑脸
  • 【算法】算法题-20231205
  • 【C++】树型结构关联式容器:map/multimap/set/multisetの使用指南(27)
  • canvas绘制小丑
  • Mysql、Oracle区分大小写?
  • 【新手解答8】深入探索 C 语言:递归与循环的应用
  • spring cloud nacos整合gateway
  • 十五、机器学习进阶知识:K-Means聚类算法
  • 【SQL SERVER】定时任务
  • 【ARM Trace32(劳特巴赫) 使用介绍 12 -- Trace32 常用命令之 d.dump | data.dump 介绍】
  • Linux: 文档 :相关接口文档手册还是需要仔细阅读
  • mfc 设置excel 单元格的列宽
  • EM32DX-C4【C#】
  • 解决:ERROR: No matching distribution found for rarfile
  • 传输层可靠传输的原理
  • 【网络安全技术】密钥管理
  • llama.cpp部署(windows)
  • LinuxBasicsForHackers笔记 --添加和删​​除软件
  • Notepad++ 安装TextFx插件失败
  • 双目光波导AR眼镜_AR智能眼镜主板PCB定制开发