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

【牛客 - 剑指offer / 快速幂】JZ16 数值的整数次方 两种方案(直接运算、快速幂) Java实现

文章目录

  • 剑指offer题解汇总 Java实现
  • 本题链接
  • 题目
  • 思路 & 代码
    • 直接运算(最朴素思想、最直接)
    • 快速幂


剑指offer题解汇总 Java实现

https://blog.csdn.net/guliguliguliguli/article/details/126089434

本题链接

知识分类篇 - 位运算 - JZ16 数值的整数次方

题目

在这里插入图片描述

思路 & 代码

直接运算(最朴素思想、最直接)

按照exponent大于0,等于0,小于0分为三种情况讨论

  • exponent > 0,直接循环,乘以相同的次数即可
  • exponent = 0,返回1.0
  • exponent < 0,exponent的值取为它的相反数,按照 exponent > 0 的情况进行相同的处理,最后用1.0去除以循环相乘的结果
import java.util.*;

public class Solution {
    public double Power(double base, int exponent) {

        if (exponent == 0) {
            return 1.0;
        }
        double res = base;
        if (exponent > 0) {
            for (int i = 1; i < exponent; i++) {
                res *= base;
            }
            return res;
        }
        res = base;
        exponent = -exponent;
        for (int i = 1; i < exponent; i++) {
            res *= base;
        }
        return 1.0 / res;
    }
}

上面的代码提交以后,显示运行结果正确,不过,在代码中for循环的部分重复写了两遍,显得有些冗余,可以对代码稍加改进,修改的地方在于:

  • 如果 exponent < 0,那么exponent 取它的相反数,并且,base的值取为1 / base值,这样无论是exponent > 0 的情况还是 exponent < 0 的情况,只要使用一个for循环就可以了

e x p o n e n t = − e x p o n e n t b a s e = 1 b a s e exponent = - exponent\\ base = \frac{1}{base} exponent=exponentbase=base1

import java.util.*;

public class Solution {
    public double Power(double base, int exponent) {

        if (exponent == 0) {
            return 1.0;
        }
        if (exponent < 0) {
            exponent = -exponent;
            base = 1.0 / base;
        }
        double res = base;
        for (int i = 1; i < exponent; i++) {
            res *= base;
        }
        return res;
    }
}

快速幂

我这样理解快速幂,主要观察指数,主要找出指数的二进制形式上,哪些位置为1

9(1001) = 2 0 + 2 3 2^0+2^3 20+23
14(1110)= 2 1 + 2 2 + 2 3 2^1+2^2+2^3 21+22+23
比如,我们要求 x 14 x^{14} x14
14是偶数,所以x赋值为 x 2 x^2 x2,14/2=7
7是奇数,所以,res= x 2 x^2 x2,x赋值为 x 2 ⋅ x 2 = x 4 x^2 \cdot x^2=x^4 x2x2=x4,7/2=3
3是奇数,所以,res= x 2 ⋅ x 4 = x 6 x^2 \cdot x^4=x^6 x2x4=x6 ,x赋值为 x 4 ⋅ x 4 = x 8 x^4 \cdot x^4=x^8 x4x4=x8,3/2=1
1是奇数,所以,res= x 6 ⋅ x 8 = x 14 x^6 \cdot x^8=x^{14} x6x8=x14,1/2=0,退出循环

import java.util.*;

public class Solution {
    public double Power(double base, int exponent) {

        if (exponent == 0) {
            return 1.0;
        }
        if (exponent < 0) {
            exponent = -exponent;
            base = 1.0 / base;
        }
        return quickPow(base, exponent);
    }

    public double quickPow(double base, int exponent) {
        double res = 1;
        while (exponent != 0) {
            //判断是否为奇数
            //是,进入if
            //否,直接跳过
            if ((exponent & 1) != 0) {
                res *= base;
            }
            base *= base;
            exponent >>= 1;
        }
        return res;
    }
}

相关文章:

  • SAP云集成 SAP Integration Suite启用过程,踩坑记
  • 【图像压缩】基于余弦变换及霍夫曼编码实现jpeg压缩和解压附matlab代码
  • MySQL开发技巧——行列转换
  • leetcode-剑指 Offer II 001. 整数除法
  • gitpod,不用clone代码就可以让项目在线上跑起来
  • 用Python制作我的核酸检测日历
  • Windows超级管理器
  • Flask 学习-34.restful-full 请求参数自定义参数校验类型 (reqparse.RequestParser() )
  • Flask 学习-36.Flask-RESTful 序列化输出对象
  • Flask 学习-37.Flask-RESTful 序列化输出fields 字段设置
  • 跨领域个性化迁移用户兴趣偏好
  • 【目标跟踪-卡尔曼滤波】基于扩展卡尔曼滤波实现目标跟踪定位附Matlab源码
  • P1510 精卫填海-01背包
  • 视频剪辑制作教学:分享十种剪辑技巧,打好基础很重要
  • C#:实现有向加权图上的Floyd Warshall算法(附完整源码)
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 【知识碎片】第三方登录弹窗效果
  • 5、React组件事件详解
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • js 实现textarea输入字数提示
  • mac修复ab及siege安装
  • PHP那些事儿
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • React-redux的原理以及使用
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • 飞驰在Mesos的涡轮引擎上
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 缓存与缓冲
  • 马上搞懂 GeoJSON
  • 那些年我们用过的显示性能指标
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 深入浅出Node.js
  • 使用API自动生成工具优化前端工作流
  • 使用parted解决大于2T的磁盘分区
  • 一道闭包题引发的思考
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • scrapy中间件源码分析及常用中间件大全
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • "无招胜有招"nbsp;史上最全的互…
  • (2020)Java后端开发----(面试题和笔试题)
  • (4)Elastix图像配准:3D图像
  • (solr系列:一)使用tomcat部署solr服务
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (二)hibernate配置管理
  • (附源码)计算机毕业设计高校学生选课系统
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (五)MySQL的备份及恢复
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转) 深度模型优化性能 调参
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .Net 4.0并行库实用性演练
  • .net core 控制台应用程序读取配置文件app.config
  • .Net Core 中间件验签
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting