数字与数学高频问题

news2024/9/23 21:27:33

关卡名

数字与数学高频问题

我会了✔️

内容

1.掌握数组实现加法的方法

✔️

2.掌握高精度计算的实现方法

✔️

3.掌握幂运算的技巧

✔️

1. 数组实现加法专题 

数字加法,小学生都会的问题,但是如果让你用数组来表示一个数,如何实现加法呢?理论上仍然从数组末尾向前挨着计算就行了,但是实现的时候会发现有很多问题,例如算到A[0]位置时发现还要进位该怎么办呢?
再拓展,假如给定的两个数,一个用数组存储的,另外一个是普通的整数,又该如何处理?
再拓展 ,如果两个整数是用字符串表示的呢?如果要按照二进制加法的规则来呢?

1.1 数组实现整数加法

先看一个用数组实现逐个加一的问题。LeetCode66.具体要求是由整数组成的非空数组所表示的非负整数,在其基础上加一。这里最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。并且假设除了整数 0 之外,这个整数不会以零开头。例如:

输入:digits = [1,2,3]

输出:[1,2,4]

解释:输入数组表示数字 123。

public static int[] plusOne(int[] digits) {
        int len = digits.length;
        for (int i = len - 1; i >= 0; i--) {
            digits[i]++;
            digits[i] %= 10;
            if (digits[i] != 0)
                return digits;
        }
        // 比较巧妙的设计
        digits = new int[len + 1];
        digits[0] = 1;
        return digits;
}

 1.2 字符串加法

我们继续看将数字保存在字符串中的情况: 字符串加法就是使用字符串来表示数字,然后计算他们的和。具体要求如下:给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

例如:

输入:num1 = "456", num2 = "77"

输出:"533"

我们先想一下小学里如何计算两个比较大的数相加的,经典的竖式加法是这样的:

从低到高逐位相加,如果当前位和超过 10,则向高位进一位。
因此我们只要将这个过程用代码写出来即可。先定义两个指针 i 和j 分别指向num1和num2的末尾,即最低位,同时定义一个变量 add 维护当前是否有进位,然后从末尾到开头逐位相加。
这里可能有个问题:两个数字位数不同该怎么处理?简单,补0即可。具体可以看下面的代码:

public String addStrings(String num1, String num2) {
    int i = num1.length()-1,j=num2.length()-1,add=0;
    StringBuilder ans = new StringBuilder();
    while(i>=0 || j>=0 || add!=0){
        int x = i>=0 ? num1.charAt(i) -'0' : 0;
        int y = j>=0 ? num2.charAt(j) -'0' : 0;
        int result = x+y+add;
        ans.append(result%10);
        add = result / 10;
        i--;
        j--;
    }
    // 计算完以后的答案需要翻转过来
    ans.reverse();
    return ans.toString();
}

1.3 二进制加法

我们继续看,如果这里是二进制该怎么处理呢?
详细要求:leetcode67.给你两个二进制字符串,这个字符串是用数组保存的,返回它们的和(用二进制表示)。其中输入为 非空 字符串且只包含数字 1 和 0。

示例1:

输入: a = "11", b = "1"

输出: "100"

示例2:

输入: a = "1010", b = "1011"

输出: "10101"

这个题也是用字符串来表示数据的,也要先转换为字符数组。我们熟悉的十进制,是从各位开始,逐步向高位加,达到10就进位,而对于二进制则判断相加之后是否为二进制的10,是则进位。本题解中大致思路与上述一致,但由于字符串操作原因,不确定最后的结果是否会多出一位进位,下面 2 种处理方式都可以:

  • 第一种,在进行计算时直接拼接字符串,得到一个反向字符,最后再翻转。
  • 第二种,按照位置给结果字符赋值,最后如果有进位,则在前方进行字符串拼接添加进位

我们这里采用第二种实现。 

public String addBinary(String a, String b) {
        StringBuilder ans = new StringBuilder();
        int ca = 0;
        for(int i = a.length() - 1, j = b.length() - 1;i >= 0 || j >= 0; i--, j--) {
            int sum = ca;
            sum += i >= 0 ? a.charAt(i) - '0' : 0;
            sum += j >= 0 ? b.charAt(j) - '0' : 0;
            ans.append(sum % 2);
            ca = sum / 2;
        }
        ans.append(ca == 1 ? ca : "");
        return ans.reverse().toString();
    }

这里还有人会想,先将其转换成十进制,加完之后再转换成二进制可以吗?这么做实现非常容易,而且可以使用语言提供的方法直接转换,但是还是那句话,工程里可以这么干,稳定可靠,但是算法里不行,太简单了。

2 幂运算 

幂运算是常见的数学运算,其形式为 a^b ,即 a 的b次方,其中 a 称为底数,b 称为指数,a^b为合法的运算(例如不会出现 a=0且b≤0 的情况)。幂运算满足底数和指数都是实数。根据具体问题,底数和指数的数据类型和取值范围也各不相同。例如,有的问题中,底数是正整数,指数是非负整数,有的问题中,底数是实数,指数是整数。
力扣中,幂运算相关的问题主要是判断一个数是不是特定正整数的整数次幂,以及快速幂的处理。

2.1 求2的幂

LeetCode231. 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == 2^x ,则认为 n 是 2 的幂次方。

示例1:

输入:n = 16

输出:true

解释:2^4 = 16

示例2:

输入:n = 3

输出:false

本题的解决思路还是比较简单的,我们可以用除的方法来逐步缩小n的值,另外一个就是使用位运算。
逐步缩小的方法就是如果 n 是 2 的幂,则 n>0,且存在非负整数 k 使得 n=2^k。
首先判断 n 是否是正整数,如果 n 是0 或负整数,则 n 一定不是 2 的幂。
当 n 是正整数时,为了判断 n 是否是 2 的幂,可以连续对 n 进行除以 2 的操作,直到 n 不能被 2 整除。此时如果 n=1,则 n 是 2 的幂,否则 n 不是 2 的幂。代码就是:

boolean isPowerOfTwo(int n) {
        if (n <= 0) {
            return false;
        }
        while (n % 2 == 0) {
            n /= 2;
        }
        return n == 1;
    }

如果采用位运算,该方法与我们前面说的统计数字转换成二进制数之后1的个数思路一致。当 n>0 时,考虑 n 的二进制表示。如果存在非负整数 k 使得 n=2^k,则 n 的二进制表示为 1 后面跟 k 个0。由此可见,正整数 n 是2 的幂,当且仅当 n 的二进制表示中只有最高位是 1,其余位都是 0,此时满足 n & (n−1)=0。因此代码就是:

public boolean isPowerOfTwo(int n) {
        return n > 0 && (n & (n - 1)) == 0;
}

2.2 求3的幂 

leetcode 326 给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3^x
对于这个题,可以直接使用数学方法来处理,如果n是3 的幂,则 n>0,且存在非负整数 k 使得 n=3^k。
首先判断 n是否是正整数,如果 n是 0或负整数,则 n一定不是 3的幂。
当 n 是正整数时,为了判断 n 是否是 3 的幂,可以连续对 n 进行除以 3 的操作,直到 n 不能被 3 整除。此时如果n=1,则 n 是 3 的幂,否则 n 不是 3 的幂。

public boolean isPowerOfThree(int n) {
        if (n <= 0) {
            return false;
        }
        while (n % 3 == 0) {
            n /= 3;
        }
        return n == 1;
    }

这个题的问题和上面2的次幂一样,就是需要大量进行除法运算,我们能否优化一下呢?这里有个技巧。
由于给定的输入 n 是int 型,其最大值为 2^31-1。因此在int 型的数据范围内存在最大的 3 的幂,不超过 2^31-1 的最大的 3 的幂是 3^19=1162261467。所以如果在1~ 2^31-1内的数,如果是3的幂,则一定是1162261467的除数,所以这里可以通过一次除法就获得:

public boolean isPowerOfThree(int n) {
        return n > 0 && 1162261467 % n == 0;
    }

当然这个解法只是拓展思路的,没必要记住1162261467这个数字。
思考 如果这里将3换成4 ,5,6,7,8,9可以吗?如果不可以,那如果只针对素数 3 、5、 7、 11、 13可以吗? 

2.3 求4的幂

LeetCode342 给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4^x。
第一种方法自然还是数学方法一直除,代码如下:

boolean isPowerOfFour(int n) {
  if (n <= 0)
        return false;
  while (n % 4 == 0)
       n /= 4;
   return n == 1;
}

这个题可以利用2的次幂进行拓展来优化,感兴趣的同学自行查阅一下吧。
除了幂运算,指数计算的思路与之类似,感兴趣的同学可以研究一下LeetCode50,实现pow(x,n)这个题。 

 

 

 

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

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

相关文章

HMI和SCADA是什么?SCADA与HMI有何不同?

工业自动化领域最常见的话题之一就是“SCADA与HMI有何不同” &#xff1f; 人机界面 &#xff08;HMI&#xff09; 和监控与数据采集 &#xff08;SCADA&#xff09; 是工业自动化领域中经常互换使用的两个概念。在许多应用中&#xff0c;两个组件之间的边界经常存在混淆。这在…

【LeetCode:2477. 到达首都的最少油耗 | DFS + 贪心】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

[HTML]Web前端开发技术6(HTML5、CSS3、JavaScript )DIV与SPAN,盒模型,Overflow——喵喵画网页

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

Jupyter Notebook中设置Cell主题

1. 获取本机Jupyter的配置目录 C:\Users\Administrator>jupyter --data-dir C:\Users\Administrator\AppData\Roaming\jupyter2. 进入获取的目录&#xff0c;创建指定路径 C:\Users\Administrator>cd C:\Users\Administrator\AppData\Roaming\jupyter C:\Users\Adminis…

机器学习实验二:决策树模型

系列文章目录 机器学习实验一&#xff1a;线性回归机器学习实验二&#xff1a;决策树模型机器学习实验三&#xff1a;支持向量机模型机器学习实验四&#xff1a;贝叶斯分类器机器学习实验五&#xff1a;集成学习机器学习实验六&#xff1a;聚类 文章目录 系列文章目录一、实验…

kafka 3.x 学习笔记

kafka 3.x 学习笔记 在 kafka 2.8.0 版本之前&#xff0c;安装使用 kafka 需要配套安装 zookeeper&#xff0c;但在 2.8.0 版本之后&#xff0c;不再需要安装 zookeeper&#xff0c;本次学习笔记采用的 kafka 版本为 3.0.0。 文章目录 kafka 3.x 学习笔记一、kafka 定义1 什么是…

学习Opencv(蝴蝶书/C++)——4.图形和大型数组类型(上)

文章目录 1. cv::Mat类的成员变量1.1 flags1.2 cv::Mat::step2 存储方式,存储位置计算2.1 存储方式2.2 🌈存储位置计算2.2.1 基本计算公式2.2.1 step代码说明2.2.3 内存地址计算代码说明3 创建数据3.0 Mat的构成3.0.1 3.0版本之后的Mat3.0.2 cvMat3.1 构造函数3.2 🌈构造函…

Tomcat的启动关闭及日志说明

目录 1 启动Tomcat 1.1 启动 1.2 检查Tomcat启动是否正常 1.3 浏览器访问 2 关闭Tomcat 3 Tomcat日志说明 3.1 catalina.out 3.2 localhost.[日期].log 3.3 host-manager.[日期].log 3.4 manager.[日期].log 3.5 localhost_access_log.[日期].txt 1 启动Tomcat 1.1 启动 在…

Centos7.4安装nginx1.24.0_安装详细步骤---Linux工作笔记066

以前安装的太模糊了,干脆重新写一个: 1.首先下载对应的nginx-1.24.0.tar.gz安装文件 2.然后: 去执行命令 安装依赖 yum install -y gcc yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel 3.然后:去解压 tar -zxvf ngi…

自动采集发布,轻松博客运营——Zblog插件指南

我们是否常常为找不到合适的文章而烦恼&#xff1f;是不是每次写作都要花费大量时间在查找资料上&#xff1f;对于将内容创作作为长期工作来说&#xff0c;保持话题新颖&#xff0c;素材内容充实是很有必要的&#xff0c;ZBlog采集插件可以将这些问题都将化繁为简。 ZBlog是什么…

前端项目中CDN的一些问题【性能优化篇】

1. CDN的概念 CDN&#xff08;Content Delivery NetWork&#xff0c;内容分发网络&#xff09;&#xff0c;是指利用最靠近每位用户的服务区&#xff0c;更快的将资源发送给用户。 提高用户的访问速度减轻服务器压力提高网站的稳定性和安全性 2. CDN的作用 CDN一般用来托管…

GaussDB数据库SQL系列-序列的使用

目录 一、前言 二、GaussDB数据库中的序列 1、语法(CREATE SEQUENCE) 2、注意事项 三、GaussDB数据库中的示例 1、示例一&#xff1a;创建普通序列 2、示例二&#xff1a;创建与表关联的序列 四、小结 一、前言 在数据库管理中&#xff0c;序列&#xff08;SEQUENCE&a…

前端开发者眼中的Node.js未来发展趋势

前言 随着互联网的高速发展&#xff0c;前端开发领域的技术也在不断演进&#xff0c;各种各样的前端技术日新月异&#xff0c;前端框架也是层出不穷。在这个变化的过程中&#xff0c;Node.js作为一种强大的服务器端运行环境&#xff0c;已经成为前端开发者的重要技术之一&#…

netty源码:(4)ServerBootstrap

ServerBootstrap的group方法用来给成员变量赋值&#xff0c;如下图 AbstractBootstrap为ServerBootstrap的父类。 ServerBootstrap的channel方法用来设置channelFactory成员变量(在父类AbstractBootstrap里&#xff09; ServerBootstrap的childHandler方法用来给本类的成员…

MySQL笔记-第05章_排序与分页

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第05章_排序与分页1. 排序数据1.1 排序规则1.2 单列排序1.3 多列排序 2. 分页2.1 背景2.2 实现规则2.3 拓展 第05章_排序与分页 讲师&#…

HNU-电路与电子学-2021期末A卷(不含解析)

【写在前面】 电路与电子学好像是从2020级开设的课程&#xff0c;故实际上目前只有2020与2021两个年级考过期末考试。 本份卷子的参考性很高&#xff0c;这是2020级的期末考卷。题目都是很典型的&#xff0c;每一道题都值得仔细研究透。 特别注意&#xff1a;看得懂答案跟写得…

【C++】map和set的使用及注意事项

map和set的使用及注意事项 1.关联式容器2. 键值对3.set3.1接口介绍3.1.1构造3.1.2迭代器3.1.3容量3.1.4修改 3.2set使用及注意事项 4.multiset5.map6.multimap349. 两个数组的交集 1.关联式容器 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xf…

【EI会议征稿中】2024年第四届数字信号与计算机通信国际学术会议(DSCC 2024)

2024年第四届数字信号与计算机通信国际学术会议&#xff08;DSCC 2024&#xff09; 2024 4th International Conference on Digital Signal and Computer Communications 第四届数字信号与计算机通信国际会议(DSCC 2024)将于2024年4月12日至14日在中国-香港举行。DSCC 2024旨…

什么是Amazon Lambda(无服务器计算服务)

Lambda 在高可用性计算基础设施上运行代码&#xff0c;用于执行计算资源的所有管理工作。这包括服务器和操作系统维护、容量调配和弹性伸缩、代码和安全补丁部署以及代码监控和日志记录。您只需要提供代码。 最近亚马逊云服务提供了超多免费的云服务&#xff0c;快来领取免费套…

Shein、Temu拓荒背后,中国快递业“卷”向海外

【潮汐商业评论/原创】 在中国互联网行业&#xff0c;软银创始人孙正义有一个耳熟能详的“时光机理论”&#xff0c;意思是充分利用不同国家和行业之间发展的不平衡&#xff0c;在发达市场获取经验&#xff0c;然后利用这些经验去开发落后的市场。从发达市场到落后市场的穿越&…