算法通关村第十三关—数字与数学高频问题(白银)

      数字与数学高频问题

一、数组实现加法专题

1.1 数组实现整数加法

 先看一个用数组实现逐个加一的问题。LeetCode66.具体要求是由整数组成的非空数组所表示的非负整数,在其基础上加一。这里最高位数字存放在数组的首位,数组中每个元素只存储单个数字。并且假设除了整数0之外,这个整数不会以零开头。例如:
image.png
 这个看似很简单是不?从后向前依次加就行了,如果有进位就标记一下,但是如果到头了要进位怎么办呢?
 例如如果digits=[9,9,9],从后向前加的时候,到了A[0]的位置计算为0,需要再次进位但是数组却不能保存了,该怎么办呢?
 这里的关键是A[0]什么时候出现进位的情况,我们知道此时一定是9,99,999这样的结构才会出现加1之后再次进位,而进位之后的结果一定是10,100,1000这样的结构,由于java中数组默认初始化为0,所以我们此时只要申请一个空间比A[]大一个单位的数组B[],然后将B[0]设置为1就行了。

class Solution {public int[] plusOne(int[] digits) {for (int i = digits.length - 1; i >= 0; i--) {digits[i] = (digits[i] + 1) % 10;//取余后不为0,不需要进位了if (digits[i] != 0) return digits;}//整个循环结束没返回,那就是100,1000这种类型的//除了第一位为1,其它位为0,创建时就默认了,不需要去赋值digits = new int[digits.length + 1]; digits[0] = 1;return digits;}
}

1.2 字符串加法

 我们继续看将数字保存在字符串中的情况:字符串加法就是使用字符串来表示数字,然后计算他们的和。具体要求如下:给定两个字符串形式的非负整数num1和um2,计算它们的和并同样以字符串形式返回。你不能使用任何內建的用于处理大整数的库(比如BigInteger),也不能直接将输入的字符串转换为整数形式。
image.png
 先定义两个指针i和j分别指向num1和num2的未尾,即最低位,同时定义一个变量add维护当前是否有进位,然后从未尾到开头逐位相加。
 这里可能有个问题:两个数字位数不同该怎么处理?简单,补0即可。具体可以看下面的代码:

public String addStrings(String num1,String num2){int i = num1.length()-1, j = num2.length()-1, add = 0;StringBuffer ans = new StringBuffer();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 二进制加法

 这个题也是用字符串来表示数据的,也要先转换为字符数组。我们熟悉的十进制,是从各位开始,逐步向高位加,达到10就进位,而对于二进制则判断相加之后是否为二进制的10,是则进位。本题解中大致思路与上述一致,但由于字符串操作原因,不确定最后的结果是否会多出一位进位,下面2种处理方式都可以:
1.第一种,在进行计算时直接拼接字符串,得到一个反向字符,最后再翻转。
2.第二种,按照位置给结果字符赋值,最后如果有进位,则在前方进行字符串拼接添加进位
这里采用第二种实现。

class Solution {public String addBinary(String a, String b) {StringBuffer str = new StringBuffer();int alen = a.length() - 1, blen = b.length() - 1, add = 0;while(alen >= 0 || blen >= 0 || add != 0){int x = alen >= 0 ? a.charAt(alen) - '0': 0;int y = blen >= 0 ? b.charAt(blen) - '0': 0;int sum = x + y + add;str.append("" + sum % 2);add = sum / 2;alen--;blen--;}return str.reverse().toString();}
}

二、幂运算

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

2.1 求2的幂

 LeetCode:231.给你一个整数n,请你判断该整数是否是2的幂次方。如果是,返回true;否则,返回false。如果存在一个整数X使得n==2^×,则认为n是2的幂次方。
image.png
 解这道题其实挺简单的,首先排除负数。然后只要一直除以2,直至除不动为止,此时判断此数是否为1,1则为true

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

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

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

2.2 求3的幂

 leetcode326给定一个整数,写一个函数来判断它是否是3的幂次方。如果是,返回true;否则,返回false。整数n是3的幂次方需满足:存在整数x使得n==3×

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

 这个题的问题和上面2的次幂一样,就是需要大量进行除法运算,我们能否优化一下呢?这里有个技巧。
v由于给定的输入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;
}

2.3 求4的幂

LeetCode:342给定一个整数,写一个函数来判断它是否是4的幂次方。如果是,返回true;否则,返回false。整数n是4的幂次方需满足:存在整数X使得n==4x。

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

总结

解决n次幂运算的通用方法
1.排除小于等于0的数
2.当该数取模n等于0时,循环除以n,直至除不了
3.返回判断该数是否等于1

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

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

相关文章

数据库传奇:MySQL创世之父的两千金My、Maria

《数据库传奇&#xff1a;MySQL创世之父的两千金My、Maria》 一、前言 MySQL是一款备受欢迎的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;最初由瑞典公司MySQL AB开发&#xff0c;目前隶属于Oracle Corporation。在DB-Engines的排名中&#xff0c;MySQL稳…

DevOps搭建(十)-安装Harbor镜像仓库详细步骤

1、下载Harbor 官方地址: https://goharbor.io/ 下载地址: https://github.com/goharbor/harbor/tags 选择文档版本进行下载,这里我们选择v2.7.2版本 2、上传到服务器并解压 上传压缩包到服务器后,解压到/usr/local目录下,执行以下解压命令 tar -zxvf harbor-offli…

一种可以实时监测蒸发量QY-ZF/F水面蒸发传感器

一种可以实时监测蒸发量QY-ZF/F水面蒸发传感器产品概述 本产品采取双层不锈钢结构设计&#xff0c;可以防止太阳直晒引起的蒸发误差。 清易QY-ZF/F水面蒸发传感器是一款用来观测水面蒸发的仪器&#xff0c;具有精度高、灵敏度高、量程宽等优势&#xff0c;可以快速地测量出单…

软信天成:企业数据目录加速数据资产管理智能化升级

随着数字时代的来临&#xff0c;数据的作用日益凸显&#xff0c;数字化能有效提高企业的运作效率。据调查统计, 数据领先型企业的指标比数据感知型企业领先50%左右。各界对数据治理的关注度逐年攀升&#xff0c;并且呈现经济越发达&#xff0c;越重视数据治理的态势。越来越多的…

安装ubuntu虚拟机并连接xShell+安装MySQL

网盘地址 链接&#xff1a;https://pan.baidu.com/s/1r-Je09AJrZcmbPYnCI6rfA?pwdk22h 提取码&#xff1a;k22h 安装 打开Vmware 一直下一步就行了 xshell连接 打开虚拟机&#xff0c;右键进入Terminal终端&#xff0c; 只复制opubuntu:~$后面的语句&#xff0c;前面op代…

加载离线镜像包:在线镜像离线为tar包、tar离线镜像包加载并根据imageId打tag

第一步&#xff1a;在线环境压缩离线镜像&#xff1a; 需要两个文件&#xff0c;第一个是脚本文件image_offline_load.sh脚本&#xff0c;第二个是image_list.txt 按行 存放需要离线的镜像名称 ./image_offline_load.sh save image_list.txt output.tar第二步&#xff1a;在离…

Python环境——conda环境切换 在特定环境下安装依赖

如下图所示 使用的命令 列出所有环境 conda env list激活特定环境 conda activate pytorch在该环境下安装 pip install tabulate

字符选择的题解

目录 原题描述&#xff1a; 题目描述 样例输入1 样例输出1 样例输入2 样例输出2 题目大意&#xff1a; 主要思路&#xff1a; change的设计&#xff1a; dp的转移&#xff1a; dp初始化&#xff1a; dp的结算&#xff1a; 注意事项&#xff1a; 代码&#xff08;有…

linux下部署东方通

第一步&#xff1a;安装jdk&#xff0c;此处不做过多介绍 第二步&#xff1a;东方通安装 1、下载东方通&#xff0c;建议去官网进行下载压缩包&#xff0c;同时下载授权文件&#xff01; 2、将压缩包上传至linux相对目录下进行解压 unzip Install_TW6.1.5.8_Enterprise_Lin…

计算机操作系统-第十五天

目录 线程的状态与转换 线程的组织与控制 本节思维导图 线程的状态与转换 线程的状态转换与进程的状态转换是一样的 线程的组织与控制 进程的控制块叫做PCB&#xff0c;线程的控制块叫做TCB 堆栈指针可以找到线程的堆栈在内存中的哪个位置&#xff0c;所以不需要保存堆栈…

Android多进程和跨进程通讯方式

前言 我们经常开发过程中经常会听到线程和进程&#xff0c;在讲述Android进程多进程前我打算先简单梳理一下这俩者。 了解什么是进程与线程 进程&#xff1a; 系统中正在运行的一个应用程序&#xff0c;某个程序一旦运行就是一个进程&#xff0c;是资源分配的最小单位&#…

SAP ABAP给销售订单添加抬头、行项目文本

SAP ABAP给销售订单添加抬头、行项目文本 第一步&#xff1a;创建文本ID 1&#xff0c;通过SE75&#xff0c;新键文本对象的文本ID 2&#xff0c;2 &#xff0c;找到对象VBBK 销售 标题文件 3&#xff0c;点击文本IDS 4&#xff0c;进去后新建文本ID 第二步&#xff1a;通过…

使用Visual Studio(VS)创建空项目的Win32桌面应用程序【main函数入口变WinMain】

前言 在Visual Studio中直接新建Windows桌面应用程序会有很多多余的代码生成&#xff0c;本文将提供从空项目创建Win32项目的方法&#xff0c;解决新建空项目直接使用WinMain代码编译报错的问题 例如&#xff1a;LNK2019 &#xff1a;无法解析的外部符号 参考博客&#xff1…

ChibiOS简介4/5

ChibiOS简介4/5 1. 源由2. ChibiOS基础知识4/52.13 Chapter 13 - RT Synchronous Messages2.13.1 Basic concepts2.13.2 APIs 2.14 Chapter 14 - RT Events2.14.1 Basic concepts2.14.1.1 Events2.14.1.2 Operations 2.14.2 APIs 2.15 Chapter 15 - RT Debug2.15.1 Compile Tim…

without explicit opt-in, is unsupported. Switch Maven repository ‘maven8

Using insecure protocols with repositories, without explicit opt-in, is unsupported. Switch Maven repository maven8 大概意思是 不支持对存储库使用不安全的协议.看下maven库&#xff0c;把http开头的改成https就好了。

B站武sir-django教程(1)

day15 初识Django Python知识点&#xff1a;函数、面向对象。前端开发&#xff1a;HTML、CSS、JavaScript、jQuery、BootStrap。MySQL数据库。Python的Web框架&#xff1a; Flask&#xff0c;自身短小精悍 第三方组件。Django&#xff0c;内部已集成了很多组件 第三方组件。…

Restormer技术点小结

1. 解决cnn的不足&#xff1a; 1&#xff09;感受野有限 2&#xff09;输入尺寸固定 2. 解决transform的不足&#xff1a; 1&#xff09;计算复杂度随着空间分辨率的增加而二次增长 3. 优势结构&#xff1a;MDTA(Multi-Dconv Head Transposed Attention)和GDFN( Gated-Dco…

Sentinel使用详解

组件简介 Sentinel是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景&#xff0c;例如秒杀、消息削峰填谷、集群流量控…

C语言 内存操作函数 +内存分区

内存操作函数 memset() //memset 函数将指定内存区域 ptr 开始的 num 个字节设置为 value。 void *memset(void *ptr, int value, size_t num);参数&#xff1a;ptr&#xff1a;指向要填充的内存区域的指针。value&#xff1a;要填充的值&#xff0c;以整数形式传递。num&…

20-11版本AUTOSAR_PRS_LogAndTraceProtocol文档翻译

1简介和概述 本协议规范规定了AUTOSAR协议Dlt的格式、消息序列和语义。 该协议允许将诊断、日志和跟踪信息发送到通信总线上。 因此&#xff0c;Dlt模块从应用程序或其他软件模块收集调试信息&#xff0c;向调试信息添加元数据&#xff0c;并将其发送到通信总线。 此外&#x…