剑指offer----C语言版----第十一天

news2025/1/14 18:22:28

目录

1. 数值的整数次方

1.1 运行超时的思路

 1.2 思路一:  快速幂 (递归实现)

 1.3 思路二:  快速幂 (迭代实现)


1. 数值的整数次方

原题链接:

剑指 Offer 16. 数值的整数次方 - 力扣(LeetCode)https://leetcode.cn/problems/shu-zhi-de-zheng-shu-ci-fang-lcof/

我们都知道,  在C语言的一根库中有一个pow函数可以用来求一个数的乘方,  本题就是要求实现类似于pow的功能.  要求实现特定库函数(特别是处理数值和字符串的函数)的功能是一类常见的面试题。这就要求我们在平时编程的时候除了能熟练使用库函数,更重要的是要理解库函数的实现原理。

1.1 运行超时的思路

想必大家第一个想到的思路就是循环.  我们对输入的幂指数进行特殊处理:  使得幂指数大于0.  然后利用for循环将底数乘到最终结果上就可以了!  很遗憾Leetcode 并不想让你这么做,  面试官也不希望看到这种解法.

double myPow(double x, int n){
    //保存结果的变量
    double result = 1.0;
    //为啥用long int 后面讲
    long int a = n;
    //如果幂指数小于0, 取绝对值, 2的-1次方就等于二分之一的一次方嘛
    if(n < 0)
    {
        a = -a;
        x = 1 / x;
    }
    //循环将底数乘到结果上
    int i = 0;
    for(i = 0;i < a;i++)
    {
        result *= x;
    }
    return result;
}

 1.2 思路一:  快速幂 (递归实现)

快速幂的本质就是分治,  大家细细品味哈. 

       以上方法不可行,  我们可以换一种思路考虑:  例如,  我们的目标是求出一个数字的32次方,如果我们已经知道了它的16次方,那么只要在16次方的基础上再平方一次就可以了。而16次方是8次方的平方。这样以此类推,我们求32次方只需要做5次乘法:  先求平方,在平方的基础上求4次方,在4次方的基础上求8次方,在8次方的基础上求16次方,最后在16次方的基础上求32次方。对于奇数次方, 我们只需要拿出一个底数出来即可. 
      也就是说,我们可以用如下公式求a 的n次方:

 同上面一样我们需要对输入的幂指数进行处理:  

将幂指数保存在一个变量,  例如 a 中,  当幂指数小于 0 时,  我们就令 a = -a,  底数x = 1 / x,  就相当于对幂指数取绝对值,  然后把幂指数的负号作用到底数上,  2 的 -1 次方就等于 1/2 的 1 次方嘛.  

注意:  保存幂指数的变量必须选用存储范围更大的 long int,  我们都知道 int 的范围是 

 当我们输入的幂指数为 - (2的31次方时),  取绝对值后 int 类型是存不下这个数的. 

解题的时间复杂度:  O(logN),  因为是递归,  函数调用需要函数栈帧,  故空间复杂度:  O(logN).


double recurison(double x, long int n)
{
    //递归的结束条件, 任何数的0次幂都等于1(0除外)
    if(n==0)
    {
        return 1;
    }
    // 将幂指数整除2, 但是我们选用位运算提高效率
    double result = recurison(x, n>>1);
    result *= result;
    //判断奇偶, 奇数就乘以一个底数, 同样使用位运算提高效率
    if((n&1)==1)
    {
        result*=x;
    }
    return result;
}

double myPow(double x, int n){
    double result;
    //对指数进行处理
    long int a = n;
    if(n < 0)
    {
        a = -a;
        x = 1 / x;
    }
    return recurison(x, a);
}

 1.3 思路二:  快速幂 (迭代实现)

还是以具体的例子来看:  我们一开始还是对幂指数进行处理使它为整数哈,  当幂指数n为偶数,  例如x ^ 8  我们先算 x * x = x ^ 2,  再算x ^ 2 * x ^ 2 = x ^ 4,  最后算x ^ 4 * x ^ 4 = x ^ 8. 对于奇数呢,  我们将指数进行拆分,  例如 x ^ 10,  指数10 = 1 + 4 + 8  = 2 ^ 0 + 2 ^ 2 + 2 ^ 3,  即 

x ^ 10 = x ^ 1 * x ^ 4 * x ^ 8

 依次类推, 直到将幂指数的二进制遍历完毕,  显然result 乘上的值在每一遍历一个二进制位时都要逐步递增:  

 偶数自然不用说,  也是满足此规律的.


double myPow(double x, int n){
    //保存结果的变量
    double result = 1.0;
    //对指数进行处理
    long int a = n;
    if(n < 0)
    {
        a = -a;
        x = 1 / x;
    }
    //遍历指数的二进制位, 对指数逐步右移即可
    while(a)
    {
        //如果二进制位为1, 乘上当时的x的二进制位值的次幂
        if((a&1)==1)
        {
            result *= x;
        }
        //下一个二进制位的, x的二进制位值的次幂
        x = x * x;
        //将a右移
        a >>= 1;
    }
    return result;
}

 由于作者表达能力有限,  思路可能不是很清晰,  望大佬们海涵.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web3学习:什么是以太坊

以太网是“世界的计算机”&#xff0c;这是以太坊平台的一种常见描述。这是什么意思呢&#xff1f;让我们首先从关注计算机科学的描述开始&#xff0c;然后对以太坊的功能和特性进行更实际的解读&#xff0c;并将其与比特币和其他分布式账本技术&#xff08;简单起见&#xff0…

深度学习笔记:神经网络(2)

对于神经网络上一篇文章&#xff0c;可见&#xff1a;https://blog.csdn.net/Raine_Yang/article/details/128473486?spm1001.2014.3001.5501 神经网络各层信号传递的实现&#xff1a; 对于全连接网络&#xff0c;连接权重的个数为&#xff08;前一层神经元总数 * 后一次神经…

el-table(type=“selection“)多选框两种回显

目录 一、前端数据回显&#xff08;页面间数据展示&#xff09; 1、图篇帮助理解 2、描述&#xff1a; 3、代码 4、两个API&#xff0c;一个v-model 二、数据库数据回显 1、描述&#xff1a; 2、核心代码: 3、比较完整代码&#xff1a;(这是element ui官方文档上的) 4…

XMLHttpRequest 对象(AJAX通信)

1.XMLHttpRequest 对象是什么&#xff1f; 浏览器与服务器之间&#xff0c;采用 HTTP 协议通信。用户在浏览器地址栏键入一个网址&#xff0c;或者通过网页表单向服务器提交内容&#xff0c;这时浏览器就会向服务器发出 HTTP 请求。 1999年&#xff0c;微软公司发布 IE 浏览器…

基于STM32F411使用SPI+DMA驱动LCD

先看效果 F411CE 硬件SPI&#xff0b;DMA驱动LCD基于HAL库 其实HAL库我用不太习惯&#xff0c;一直也是用的标准库 但HAL库确实是好上手一些&#xff0c;就迅速创建一个新的template 这次就当尝试一下吧&#xff0c;因为用的比较少&#xff0c;我会记录的详细 如图点击&…

火山引擎DataLeap数据调度实例的 DAG 优化方案

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;并进入官方交流群 实例 DAG 介绍 DataLeap 是火山引擎自研的一站式大数据中台解决方案&#xff0c;集数据集成、开发、运维、治理、资产管理能力于一身的大数据研发治理套件。在平台中&…

从0到1完成一个Vue后台管理项目(四、引入axios、配置路由)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; axios axios就是…

手握智算中心“绿洲”,毫末跑在中美自动驾驶长跑第一线

作者 | 白日梦想家 编辑 | 王博2022年过去&#xff0c;数据驱动成为自动驾驶演进共识。沿着数据驱动这条路线&#xff0c;自动驾驶加速迈入智算时代。 智算中心应运而生。 实际上&#xff0c;将智算引入自动驾驶的开先河者是特斯拉&#xff0c;其率先发布了专用于自动驾驶训练的…

登录与授权

目录 1.获取用户信息 1.button.open-type.getUserInfo 2.open-data组件 3.wx.getUserProfile(Object object) 头像昵称填写功能 2.登录 登录的流程图 sessin_key 3.授权 wx.openSetting wx.getSetting wx.authorize 手机号授权 登录与授权是两个不关联的事情&…

[Leetcode] 相同的树、对称二叉树

相同的树和对称二叉树都可以使用递归实现。相同的树题目链接&#xff1a;https://leetcode.cn/problems/same-tree/solution/xiang-tong-de-shu-by-leetcode-solution/1.1 递归、深度优先搜索使用递归&#xff0c;将问题转换为 --> 判断当前节点是否相同 判断左右子树分别是…

以前不知道字节面试难在哪,现在体验到了,被虐的很惨...

人们都说&#xff0c;互联网寒冬来了&#xff0c;这个时候还在大面积招人的公司&#xff0c;必然是牛逼的公司。而这个时候勇敢跳槽的人&#xff0c;必然是牛逼的人。于是我开始了字节跳动的社招面试。 为了这天&#xff0c;我前一天排老长的队&#xff0c;理了个利落的发型&a…

蚂蚁帮路由器Antbang A3s V2.0刷入OpenWrt/LEDE

参考资料路由器基本常识_冰色阳光的博客-CSDN博客_路由器bootloader是什么https://www.right.com.cn/forum/thread-3191610-1-1.html已知问题刷入OpenWrt/LEDE后&#xff0c;似乎路由器的Reset键不起作用。路由器在启动时&#xff0c;正常会先运行引导程序Breed&#xff0c;然后…

LinuxC—文件系统学习笔记

文件系统 1 目录和文件 1.1 获取文件属性信息stat 相关函数 stat() 得到file指向的文件并将其属性回填到buf中&#xff0c;面对符号链接文件时获取的是所指向的目标文件的属性 /* Get file attributes for FILE and put them in BUF. */ extern int stat (const char *__res…

Jetson nano 入手系列之5—远程可视化访问:jupyter lab与VNC连接

Jetson nano 入手系列之5—远程可视化访问&#xff1a;jupyter lab与VNC1. jupyter lab1.1 安装jupyter lab1.2 配置jupyter_lab1.3 打开jupyter lab1.3.1 ip地址方式打开1.3.2 cmd中ssh方式打开2. vino与VNC Viewer2.1 vino的安装2.2 Desktop Sharing配置与设置2.3 启动vino s…

ICG-DBCO;吲哚菁绿-二苯基环辛炔,荧光染料标记DBCO

中文名&#xff1a;吲哚菁绿-二苯基环辛炔 英文名&#xff1a;ICG-DBCO&#xff0c;ICG-Dibenzocyclooctyne 分子式: C63H64N4O5S 分子量: 989.27 g/mol 外观&#xff1a;绿色粉末 激发发射波长:785/821nm 结构式&#xff1a; ​ 溶解度&#xff1a;有机溶剂/水 储藏方法…

使用无人机 LiDAR 的重叠树冠的新型植被点云密度树分割模型

Paper题目&#xff1a;A Novel Vegetation Point Cloud Density Tree-Segmentation Model for Overlapping Crowns Using UAV LiDAR Abstract 由于常用的冠层高度模型(CHM)的局限性&#xff0c;在具有高密度和重叠树冠的森林生态系统中检测和分割单个树木经常会导致偏差。针对…

Flink 第3章 反压策略

概述Flink 中文网站的讲解https://flink-learning.org.cn/article/detail/138316d1556f8f9d34e517d04d670626涉及内容&#xff1a;网络流控的概念与背景TCP的流控机制Flink TCP-based 反压机制 1.5之前Flink Credit-based 反压机制 1.5及以后总结与思考网络流控的概念与背景为什…

AtCoder Beginner Contest 283 E - Don‘t Isolate Elements

E - Dont Isolate Elements (atcoder.jp)题意&#xff1a;题意&#xff1a;定义孤独的数为&#xff0c;该数上下左右的数都和它相反给定一个01矩阵&#xff0c;每次操作可以把某一行的数取反&#xff0c;问你把该矩阵变成没有孤独的数的最少操作次数是多少思路&#xff1a;一开…

AI降噪的N种数据扩增方法

数据和特征决定了机器学习的上限&#xff0c;而模型和算法只是逼近这个上限而已 基于统计信号处理的传统噪声抑制方法是通过检测持续的背景声&#xff0c;来估计背景噪声&#xff0c;然后通过估计到的背景噪声计算增益因子对带噪语音进行抑制。但这种方式针对规律的稳态噪声比较…

【算法笔记】最近公共祖先(LCA)算法详解

0. 前言 最近公共祖先简称 LCA&#xff08;Lowest Common Ancestor&#xff09;。两个节点的最近公共祖先&#xff0c;就是这两个点的公共祖先里面&#xff0c;离根最远的那个。 这种算法应用很广泛&#xff0c;可以很容易解决树上最短路等问题。 为了方便&#xff0c;我们记…