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

前言

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

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 !== 0if (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.rhkb.cn/news/124401.html

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

相关文章

rk3399 linux 5.10 usb 2.0设备上电概率性注册失败

多次开关机&#xff0c;发现usb hub和4G都通信失败了&#xff0c;这就有点奇怪了&#xff0c;按理说usb驱动是没啥问题的 先查看usb log rootlinaro-alip:/# dmesg | grep usb [ 1.723797] usbcore: registered new interface driver usbfs [ 1.723828] usbcore: regis…

在很多公司里面会使用打tag的方式保留版本

&#xff1a;git tag|grep "xxx-dev“等分支来查看 2&#xff1a;git cherry-pick XXXXX 然后就是查看有冲突这些 git status 会出现相关的异常 然后解决相关的冲突 git add . git cherry-pick --continue git push XXX HEAD:refs/for/XXX 第一&#xff1a;git ta…

【LeetCode-中等题】17. 电话号码的字母组合

文章目录 题目方法一&#xff1a;递归回溯 题目 方法一&#xff1a;递归回溯 参考讲解&#xff1a;还得用回溯算法&#xff01;| LeetCode&#xff1a;17.电话号码的字母组合 首先可以画出树图&#xff1a; 先将数字对应的字符集合 加入到一个map集合 这里需要一个index来控…

伪静态web.config常见规则写法与参数介绍说明

伪静态web.config常见规则写法与参数介绍说明. 示例1&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <configuration><system.webServer><rewrite><rules><rule name"规则 1" stopProcessing"tru…

【AI理论学习】语言模型:从Word Embedding到ELMo

语言模型&#xff1a;从Word Embedding到ELMo ELMo原理Bi-LM总结参考资料 本文主要介绍一种建立在LSTM基础上的ELMo预训练模型。2013年的Word2Vec及2014年的GloVe的工作中&#xff0c;每个词对应一个vector&#xff0c;对于多义词无能为力。ELMo的工作对于此&#xff0c;提出了…

Go 接口和多态

在讲解具体的接口之前&#xff0c;先看如下问题。 使用面向对象的方式&#xff0c;设计一个加减的计算器 代码如下&#xff1a; package mainimport "fmt"//父类&#xff0c;这是结构体 type Operate struct {num1 intnum2 int }//加法子类&#xff0c;这是结构体…

MySQL——数据库以及数据表的创建

创建数据库 回到刚才创建数据库的问题&#xff0c;我们在创建数据库的时候可以通过添加一个参数&#xff0c;这个参数的意义在于当我们创建的数据库已经存在的时候则不会创建&#xff0c;也不会报错&#xff0c;如果不使用这个参数&#xff0c;则我们在重复创建一个已经存在的…

数据结构--- 树

(一)知识补充 定义 树是一种数据结构,它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。​ 它具有以下的特点: 每个节点有零个或多个子节点; 没有父节点的节点称为根节点;每一个非根…

2023高教社杯 国赛数学建模E题思路 - 黄河水沙监测数据分析

1 赛题 E 题 黄河水沙监测数据分析 黄河是中华民族的母亲河。研究黄河水沙通量的变化规律对沿黄流域的环境治理、气候变 化和人民生活的影响&#xff0c; 以及对优化黄河流域水资源分配、协调人地关系、调水调沙、防洪减灾 等方面都具有重要的理论指导意义。 附件 1 给出了位…

vue2笔记

Vue笔记 视频: https://www.bilibili.com/video/BV1Zy4y1K7SH?p1 vue是渐进式JavaScript框架 用到什么功能&#xff0c;只需要引入什么功能模块 ; vue的特点:易用,灵活,高效; 组件化 , 一个vue文件包括了(html css js)声明式编程(不直接操作DOM) ;虚拟DOM diff算法(虚拟dom…

C# 基础面试题(万字)

1.选择题 1. 简述下面选项能够捕获运算溢出的异常类型的有 &#xff1f; A)Exception B)SystemException C)ArithmeticException D)OverflowException 试题回答&#xff1a;AD 2. 程序员可使用&#xff08;&#xff09;语句以程序方式引发异常 &#xff1f; A)run B)try C)th…

LAMP搭建WordPress

L linux A apache hhtpd M mysql/maridb P PHP1、 安装php yum -y install php php-fpm php-server php-mysql1.1、 启动php-fpm并自启 systemctl enable php-fpm --now[rootecs-1cee ~]# systemctl status php-fpm ● php-fpm.service - The PHP FastCGI Process ManagerLoa…

VR农学虚拟仿真情景实训教学演示

首先&#xff0c;VR农学虚拟仿真情景实训教学提供了更为真实的实践环境。传统的农学实训往往受制于时间、空间和资源的限制&#xff0c;学生只能通过观察或简单的模拟来学习农业知识和技能。而借助虚拟现实技术&#xff0c;学生可以进入虚拟农场&#xff0c;与各种农作物、工具…

【运维日常】infiniband网络架构,容器间跨机器不同网段通信

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

PY32F003F18按键输入

一、PY32F003F18的GPIO介绍 1、PY32F003F18的18个I/O&#xff0c;均可作为外部中断&#xff1b; 2、每个GPIO都可以由软件配置为输出&#xff1a; 1)、推挽输出(push-pull) 2)、开漏极输出(open drain) 注意:驱动电流为8mA; 3、每个GPIO都可以由软件配置为输入&#xff1a; 1)、…

c语言初阶指针

目录 何为指针 地址大小 野指针 成因 如何规避 有效性 指针计算 -整数 ​编辑 指针比较运算 指针-指针 ​编辑 数组与指针关系 二级指针 指针数组 应用 何为指针 指针就是指针变量&#xff0c;用来存放内存空间的一个编号&#xff0c;将指针比作我们宾馆的客人&a…

前端 JS 经典:上传文件

重点&#xff1a;multipart/form-data 后端识别上传类型必填 1. form 表单上传 <!-- enctype"multipart/form-data" 这个必填 --> <form action"http://127.0.0.1:8080/users/avatar" method"post" enctype"multipart/form-data…

软件工程课件

软件工程 考点概述软件工程概述能力成度模型能力成熟度模型集成软件过程模型逆向工程![ ](https://img-blog.csdnimg.cn/425cea8190fb4c5ab2bf7be5e2ad990e.png) 考点概述 重点章节 软件工程概述 之前老版教程的&#xff0c;之前考过 能力成度模型 记忆 能力等级 和 特点 能力…

最强的AI视频去码图片修复模型:CodeFormer

目录 1 CodeFormer介绍 1.1 CodeFormer解决的问题 1.2 人脸复原的挑战 1.3 方法动机 1.4 模型实现 1.5 实验结果 2 CodeFormer部署与运行 2.1 conda环境安装 2.2 运行环境构建 2.3 模型下载 2.4 运行 2.4.1 人脸复原 ​编辑​编辑 2.4.2 全图片增强 2.4.3 人脸颜色…

linux-进程-execl族函数

exec函数的作用&#xff1a; 我们用fork函数创建新进程后&#xff0c;经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时&#xff0c;该进程被完全替换为新程序。因为调用exec函数并不创建新进程&#xff0c;所以前后进程的ID并没有改变。 简单来说就是&…