leetcode刷题(剑指offer) 50.Pow(x, n)

50.Pow(x, n)

实现 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
  • n 是一个整数
  • 要么 x 不为零,要么 n > 0
  • -104 <= xn <= 104

题解

计算x的n次幂,主要有以下几种方法。

  • 直接迭代求解,时间复杂度为n
  • 快速幂运算,时间复杂度为logn
  • 使用位运算的思想,进行快速幂运算,时间复杂度为logn

迭代求解,这里就忽略了,直接进入快速幂运算。

这种算法的本质是分治算法,如果要求x的100次方,可以使用 x 5 0 ∗ x 5 0 x^50 * x^50 x50x50,再递归下去使用 x 2 5 ∗ x 2 5 x^25 * x^25 x25x25求解得出 x 5 0 x^50 x50,按此逻辑一直递归下去即可。

快速幂运算,会出现的两种情况,求奇次幂,求偶次幂。如下图所示。

使用快速幂运算解题代码如下:

package com.offer;public class _50Powx_n {public static void main(String[] args) {double x = 2;int n = -2147483648;System.out.println(myPow(x, n));}public static double myPow(double x, int n) {if (x == 0) return 0;if (n == 0) return 1;long N = n;if (n < 0) {return 1 / quickPow(x, -N);}else {return quickPow(x, N);}}public static double quickPow(double x, long n) {if (n == 0) return 1;if (n == 1) return x;if (n % 2 == 1) {return x * quickPow(x, n - 1);}else {x = quickPow(x, n / 2);return x * x;}}
}

下面是基于位运算思想的快速幂运算

这种思想是利用二进制不同位的不同权重的思想来解决的。在计算结果的时候顺带计算出当前位的权重。

举个栗子,求解3的11次方,如下图所示。

底数为3,指数分别对应二进制每个位的权重,将二进制位为1的数位都相乘。即可得出最后的幂运算结果。

代码实现如下:

package com.offer;public class _50Powx_n {public static void main(String[] args) {double x = 2;int n = 5;System.out.println(myPow(x, n));}public static double myPow(double x, int n) {if (x == 0) return 0;if (n == 0) return 1;long N = n;if (n < 0) {return 1 / quickPow(x, -N);}else {return quickPow(x, N);}}public static double quickPow(double x, long n) {double res = 1;double pow = x;while (n != 0) {if ((n & 1) == 1){res *= pow;}pow *= pow;n >>= 1;}return res;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/438703.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

江科大stm32学习笔记5——蜂鸣器

目录 一、接线 二、代码部分 三、查看库函数的方法 一、接线 蜂鸣器选择有源高电平触发蜂鸣器。 GND——GND VCC——正极 I/O——B12 注意&#xff1a;32上的PA15、PB3、和PB4是默认调试端口&#xff0c;如果使用需要进行额外配置&#xff0c;一般避开这三个端口。 二、…

2024 年, Web 前端开发趋势

希腊哲学家赫拉克利特认为&#xff0c;变化是生命中唯一不变的东西。这句话适用于我们的个人生活、行业和职业领域。 尤其是前端开发领域&#xff0c;新技术、开发趋势、库和框架不断涌现&#xff0c;变化并不陌生。最近发生的一些事件正在改变开发人员构建网站和 Web 应用的方…

图像复原的天花板在哪里?SUPIR:开创性结合文本引导先验和模型规模扩大

SUPIR&#xff08;Scaling-UP Image Restoration&#xff09;&#xff0c;这是一种开创性的图像复原方法&#xff0c;利用生成先验和模型扩大规模的力量。通过利用多模态技术和先进的生成先验&#xff0c;SUPIR在智能和逼真的图像复原方面取得了重大进展。作为SUPIR中的关键催化…

项目解决方案:市小区高清视频监控平台联网整合设计方案(上)

目 录 一、项目需求 1.1业务需求 1.2技术需求 1.3 环境要求 1.3.1 硬件要求 1.3.2 技术服务要求 二、系统设计方案 2.1 视频监控平台基础功能设计 2.2 视频资源及联网设备编码与管理设计 2.2.1 全省现有联网视频资源属性 2.2.2 视频资源编码具体格…

鸿蒙OS之Rust开发

背景 Rust是一门静态强类型语言&#xff0c;具有更安全的内存管理、更好的运行性能、原生支持多线程开发等优势。Rust官方也使用Cargo工具来专门为Rust代码创建工程和构建编译。 OpenHarmony为了集成C/C 代码和提升编译速度&#xff0c;使用了GN Ninja的编译构建系统。GN的构…

认识产品经理 一个合格的产品经理 产品经理分类

目录 一.合格的产品经理 什么是产品 什么是产品经理 合格的产品经理 什么是产品&#xff1f;区别是&#xff1f; 什么是产品经理 合格的产品经理需要关注哪些核心问题&#xff1f; 二.产品经理分类 为什么会有不同类型 都有那些类型 根据不同类型的职责特点规划个人…

LAN安全及概念

实验大纲 一、终端安全 1.当前比较流行的网络攻击 2.常见的网络安全设备 3.终端受到攻击的主要途径 4.传统的基于主机的安全防护手段 二、访问控制 1.本地口令验证 2.AAA组成 3.身份验证 4.记账 5. 802.1X 三、第2层安全威胁 交换机攻击分类 四、MAC地址表 MAC地…

CC核心内容

目录 标准流: 盒子模型: 1.标准盒子模型 2.怪异盒子模型 浮动: 定位: 标准流、盒子模型、浮动、定位 Div是一个块级元素&#xff0c;span是内行元素 div元素通常用于创建一个独立的区块&#xff0c;它会单独占据一行或多行的空间 span元素通常用于包裹文本或内行元素&…

OpenGL/C++_学习笔记(四)空间概念与摄像头

汇总页 上一篇: OpenGL/C_学习笔记&#xff08;三&#xff09; 绘制第一个图形 OpenGL/C_学习笔记&#xff08;四&#xff09;空间概念与摄像头 空间概念与摄像头前置科技树: 线性代数空间概念流程简述各空间相关概念详述 空间概念与摄像头 前置科技树: 线性代数 矩阵/向量定…

Gitlab7.14 中文版安装教程

Gitlab7.14 中文版安装教程 注&#xff1a; 本教程由羞涩梦整理同步发布&#xff0c;本人技术分享站点&#xff1a;blog.hukanfa.com转发本文请备注原文链接&#xff0c;本文内容整理日期&#xff1a;2024-01-28csdn 博客名称&#xff1a;五维空间-影子&#xff0c;欢迎关注 …

企业软件项目成果-图像识别

电子标绘系统&#xff1a;http://t.csdnimg.cn/h8kHN 下面图像识别仅仅使用了OpenCV库而已&#xff0c;并没有涉及深度学习、机器学习。 整盘样本的拍照识别结果&#xff08;识别准确率达100%&#xff09;&#xff1a; 宫颈刷图像识别的测试结果&#xff08;识别准确率达1…

分布式事务入门,最终一致性方案

分布式事务 回顾分布式事务 上篇内容我们说到了分布式事务的基本内容&#xff0c;讲到了分布式事务的实现主要有事务协调以及最终一致性两件事情来完成整个逻辑。 那么上个文章我们说过了 2PC、3PC、XA 三种协调事务的协议&#xff0c;这次我们来说事务协调处理完成后&#x…