算法通关村第十三关——溢出问题处理模板

news2024/11/26 22:33:12

前言

溢出问题是面试当中输出涉及到数字的一个需要特别注意的地方,典型的题目有三个:数字反转,将字符串转成数字和回文数。

1.整数反转

力扣7题,给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [ − 2 31 , 2 31 − 1 ] [−2^{31}, 2^{31} − 1] [231,2311],就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。

分析:这个问题处理时需要考虑两点:1.如何反转数字,2.反转后的数字是否会溢出。反转比较简单,我们可以使用循环取模取余的方法,也就是一边左移,一边处理末尾数字。以33156为例,循环取模然后为了得到末尾数字循环取余,即可得到6,5,1,3,3,最后反转拼接。

在这里插入图片描述

按照循环取模,只要最后输入的x !== 0即可终止。

对于溢出,比如1245221927这个数,反转过来就是7291225421,已经比最大的32位整数都要大了,如果一个整数num > MAX_VALUE, 其中MAX_VALUE = 214746483647 那么就有如下规律:

nums / 10 > MAX_VALUE / 10 = 214748364,也就是如果底数第二位大于4了,那么最后一位是什么都已经溢出了

在这里插入图片描述

如上图所示:

  • num / 10 > 214748364那肯定会溢出
  • num / 10 = 214748364,需要考虑上图第三四五排数字,如果末尾数字> 7,说明溢出
  • num / 10 < 214748364,说明没问题

完整实现代码如下:

// 循环取模取余
function reverse(x) {
	let res = 0;
	while (x !== 0) {	
		// 获得末尾数字
		let tailNum = x % 10;
		// 判断是否超出最大32位整数
		if (res > 214748364 || (res === 214748364 && tailNum > 7)) {
			return 0;
		}
		// 判断是否超出最小32位整数
		if (res < -214748364 || (res === -214748364 && tailNum < -8)) {
			return 0;
		}

		res = res * 10 + tailNum;
		// Math.floor() 函数总是返回小于等于一个给定数字的最大整数,对于负数,精确度不够
		x = ~~(x / 10); // ~~ 是相当于 parseInt,这里存在一个关于浮点数的精确度问题
	}
	return res;
}

2.字符串转整数

这道题在我的另外一篇文章已经讲过,这里不再重复。算法通关村第十二关——不简单的字符串转换问题

3.回文数

力扣9题,给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。

分析:第一个想法是将数字转换为字符串,并检查字符串是否为回文。但是,这需要额外空间来创建问题描述中所不允许的字符串。
第二个想法是将数字本身反转,然后将反转后的数字与原始数字进行比较,如果相同,说明是回文。 但如果反转后的数字大于int.MAX,就会遇到整数溢出问题。
其实只要改进一下第二个想法就可以避免数字反转可能导致的溢出问题,我们可以只反转数字的一半,因为如果数字是回文,其后半部分反转后应该与原始数字的前半部分相同。
例如,输入 142241,我们可以将数字 “142241” 的后半部分从 “241” 反转为 “142”,并将其与前半部分 “142” 进行比较,因为二者相同,得知数字 14241 是回文数。

代码如下:

function isPalindrome(x) {
	// 特判, 如果x < 0或者x % 10 === 0 &&  x !== 0
	if (x < 0 || (x % 10 === 0 &&  x !== 0)) {
		return false;
	}

	let reversedNum = 0;
	// 循环取模取余来反转数字,反转一半数字来进行比较,如果是回文整数,
	// 则反转的一半应当等于未反转的的那一半
	while (x > reversedNum) {
		reversedNum = reversedNum * 10 + x % 10;
		x = parseInt(x / 10);
	}

	// 当数字长度为奇数时,可以通过 parseInt(reversedNum / 10)去除处于中间的数字
	// 例如,当输入 x = 23232 时,在循环的末尾可以得到 x = 23, reversedNum = 232,
	// 由于处于中间的数字不影响回文(它总是与自己相等),所以可以简单地将其去除。
	return x === reversedNum || x === parseInt(reversedNum / 10);
}

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

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

相关文章

Vue + Element UI 前端篇(十五):嵌套外部网页

Vue Element UI 实现权限管理系统 前端篇&#xff08;十五&#xff09;&#xff1a;嵌套外部网页 嵌套外部网页 在有些时候&#xff0c;我们需要在我们的内容栏主区域显示外部网页。如查看服务端提供的SQL监控页面&#xff0c;接口文档页面等。 这个时候就要求我们的导航菜…

Intel OneAPI黑客松记录

题目&#xff1a; 生成2048*2048个随机单精度实数; 实现两维Real to complex FFT参考代码; 使用OneMKL计算两维Real to complex FFT; 对两维FFT输出数据进行全数据比对&#xff1b; 平均性能数据比对,输出FFT参考代码平均运行时间和oneMKL FFT平均运行时间。 代码&#x…

12 - 多线程之锁优化(上):深入了解Synchronized同步锁的优化方法

在并发编程中&#xff0c;多个线程访问同一个共享资源时&#xff0c;我们必须考虑如何维护数据的原子性。在 JDK1.5 之前&#xff0c;Java 是依靠 Synchronized 关键字实现锁功能来做到这点的。Synchronized 是 JVM 实现的一种内置锁&#xff0c;锁的获取和释放是由 JVM 隐式实…

序列化二叉树

解题思路一&#xff1a; import java.util.*; /* public class TreeNode {int val 0;TreeNode left null;TreeNode right null;public TreeNode(int val) {this.val val;}} */ public class Solution {int index -1;String Serialize(TreeNode root) {StringBuffer resul…

Jenkins介绍

Jenkins介绍 持续集成、持续部署的工具很多&#xff0c;其中Jenkins是一个开源的持续集成平台。 Jenkins涉及到将编写完毕的代码发布到测试环境和生产环境的任务&#xff0c;并且还涉及到了构建项目等任务。 Jenkins需要大量的插件保证工作&#xff0c;安装成本较高&#xff0…

FreeRTOS源码分析-14 操作系统多任务核心

1 列表及列表项概念及其应用 1.1 freeRTOS列表介绍 任务调度列表介绍 其他组件列表介绍 1.2 列表及列表项的定义 双向链表结构 1&#xff1a;插入与删除效率高&#xff0c;只要操作一次就能完成 2&#xff1a;对数据的管理更加灵活与便捷&#xff0c;有利于编写逻辑清晰的…

MyBatisPlus入门篇2 - 条件查询、查询投影、查询条件、id生成策略、多记录操作、逻辑删除

目录 1.条件查询、多条件查询 MyBatisPlus将书写复杂的SQL查询条件进行了封装&#xff0c;使用编程的形式完成查询条件的组合。 Test void testGetByCondition() {// 方式一&#xff1a;按条件查询QueryWrapper<User> qw new QueryWrapper<User>();qw.lt("…

解决虚拟机克隆后IP和命名冲突问题

目录 解决IP冲突问题 解决命名冲突 解决IP冲突问题 克隆后的虚拟机和硬件地址和ip和我们原虚拟机的相同&#xff0c;我们需要重新生成硬件地址和定义ip&#xff0c;步骤如下&#xff1a; &#xff08;1&#xff09;进入 /etc/sysconfig/network-scripts/ifcfg-ens33 配置文件…

【MySQL】7、MHA高可用配置及故障切换

MHA概述 MHA&#xff08;Master High Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA用来解决MySQL单点故障问题&#xff1b; MySQL故障切换过程中&#xff0c;能30秒内自动完成故障切换&#xff0c;并保证数据的一致性&#xff0c;实…

远程工作面试:特殊情况下的面试技巧

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Python批处理(一)提取txt中数据存入excel

Python批处理&#xff08;一&#xff09;提取txt中数据存入excel 问题描述 现从冠层分析软件中保存了叶面积指数分析的结果&#xff0c;然而软件保存格式为txt&#xff0c;且在不同的文件夹中&#xff0c;每个文件夹的txt文件数量不固定&#xff0c;但是txt文件格式固定。现需…

Java多线程父线程向子线程传值解决方案

目录 1 背景2 ThreadLocalTaskDecorator3 RequestContextHolderTaskDecorator4 MDCTaskDecorator5 InheritableThreadLocal5.1 源码分析5.2 InheritableThreadLocal存在的问题 6 TransmittableThreadLocal 1 背景 在实际开发过程中我们需要父子之间传递一些数据&#xff0c;比…

zemax非序列文件转为序列文件

打开系统内部的一个参考案例&#xff1a; 添加一个新面在最前面&#xff0c;设置为孔径光阑&#xff1a; 转换&#xff1a; 此时的3D外形图&#xff1a; 删去不必要的&#xff0c;保留透镜&#xff1a; 加入椭圆光源&#xff1a; 插入探测器&#xff1a; 执行光线追迹&#xff…

day 47 | ● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 如果用dp判断true or false无法满足&#xff0c;所以dp用来表示以下标i-1为结尾的字符串s&#xff0c;和以下标j-1为结尾的字符串t&#xff0c;相同子序列的长度 func isSubsequence(s string, t string) bool {dp : make([][]int, len(s) 1)for i : 0; i &…

用户端APP自动化测试_L2

目录&#xff1a; appium server 环境安装capability 进阶用法元素定位工具高级定位技巧-xpath 定位高级定位技巧-css 定位与原生定位特殊控件 toast 识别显式等待高级使用高级控件交互方法设备交互api模拟器控制雪球财经app股票详情功能点自动化测试实战 1.appium server 环…

Web自动化测试进阶 —— Selenium模拟鼠标操作

鼠标操作事件 在实际的web产品测试中&#xff0c;对于鼠标的操作&#xff0c;不单单只有click()&#xff0c;有时候还要用到右击、双击、拖动等操作&#xff0c;这些操作包含在ActionChains类中。 ActionChains类中鼠标操作常用方法&#xff1a; 首先导入ActionChains类&…

typecho 反序列化漏洞复现

环境搭建 下载typecho14.10.10 https://github.com/typecho/typecho/tags 安装&#xff0c;这里需要安装数据库 PHPINFO POC.php <?php class Typecho_Feed { const RSS1 RSS 1.0; const RSS2 RSS 2.0; const ATOM1 ATOM 1.0; const DATE_RFC822 r; const DATE_W3…

企业宣传片和传统纸媒相关优劣

在当今数字化时代&#xff0c;传统纸媒和宣传片成为了企业和组织宣传推广的两种主要方式。然而&#xff0c;面对有限的资源和日益竞争的市场环境&#xff0c;我们需要仔细权衡选择哪种方式更加适合。接下来由深圳企业宣传片制作公司老友记小编从以下几个方面浅析一下它们的优势…

易语言特征码的应用

一、本章概要 注&#xff1a;搜特征码一定要从代码段的开始搜索&#xff0c;防止别人加了壳之后你不知道怎么搞&#xff0c;然后ctrlb把特征码&#xff08;比如ff55fc5f5e&#xff09;粘贴进去 搜到test edx,3往上面看有没有上面三句&#xff0c;有就是易语言的特征码 按钮事…

档案数字化加工扫描软件的作用有哪些方面?

档案数字化加工扫描软件是在技术进步和需求驱动的双重作用下产生的&#xff0c;以满足纸质档案转化为数字形式、数字化档案管理和利用的需求&#xff0c;它们不断演进和改进&#xff0c;并推动着档案工作的现代化和数字化发展。 档案数字化加工扫描软件的作用有哪些方面&#x…