当前位置: 首页 > news >正文

字符串- 字符串转换整数 (atoi)

题目:

https://leetcode.cn/problems/string-to-integer-atoi/description/

代码

/*
参数:字符串
返回值:转换为的32为有符号整数;
*/
int myAtoi(string s) {int n = s.size();//1、去除前导空格int i = 0;while (i < n && s[i] == ' ') {i++;}//2、检查符号;int sign = 1;if (i< n &&(s[i] == '-' || s[i] == '+')) {sign = (s[i] == '-') ? -1 : 1;i++;}//3、读数,读到非数字或到达字符串末尾int result = 0;while (i < n && isdigit(s[i])){int digit = s[i] - '0';// 检查溢出(处理 INT_MAX 和 INT_MIN 的边界)if (result > (INT_MAX - digit) / 10) {return (sign == 1) ? INT_MAX : INT_MIN;}result = result * 10 + digit;i++;}return sign * result;}

分析:


1、分析越界设计

if (result > (INT_MAX - digit) / 10) {
            return (sign == 1) ? INT_MAX : INT_MIN;
        }
这里的分析越界的设计比较有意思,
越界的可能出现在result值变更的某个时机,在这时机之前我们先进行安全性判断;
2、为什么用 result > (INT_MAX - digit) / 10 来判断?

这是为了避免在判断过程中本身就发生溢出。

假设我们直接判断 result * 10 + digit > INT_MAX,当 result 很大时,result * 10 可能已经超过 INT_MAX,导致计算过程中就发生溢出(例如 result = 214748365 时,result * 10 已经是 2147483650,超过 INT_MAX 的 2147483647),此时的判断结果是不可靠的。
通过数学变形可以避免这个问题:

result * 10 + digit > INT_MAX

→ 移项得:result * 10 > INT_MAX - digit

→ 两边除以 10(因都是正数,不等号方向不变):result > (INT_MAX - digit) / 10
这样的变形确保了所有计算都在 INT_MAX 范围内进行,不会发生中间溢出,判断更安全。

3. 为什么没有单独判断 result * 10 + digit < INT_MIN 也能生效?
==》
对于正数,精确判断是否超过 INT_MAX;
对于负数,通过 “判断是否超过 INT_MAX” 来覆盖 “超过 INT_MIN 绝对值” 的场景。
    
其实因为INT_MIN绝对值和INT_MAX绝对值只差1,因为结果是整数,不是小数,超过INT_MAX之后下一个数就是INT_MIN的绝对值了,即事实上本来就得返回INT_MIN,所以无误差

    
    

http://www.dtcms.com/a/586508.html

相关文章:

  • WordPress做大站wordpress的图片代码是什么
  • 微信制作微网站开发建设网站深圳罗湖
  • 电子商务在线网站建设佛山网红公寓
  • Java零基础入门:面向对象进阶 --- OOP(下)
  • Alertmanager 安装与配置指南
  • 数字孪生平台:让航天装备管理更智能、更可靠
  • 南阳网站排名优化价格已有网站怎么修改
  • 图片网站怎么做优化桂林市区漓江水倒灌
  • 李宏毅机器学习笔记43
  • 电子邮箱注册网站申请教育课程网站建设
  • 关于支持向量机算法的学习
  • 什么网站做hevc网站建设hyioi
  • 如何把自己做的网站挂网上网站项目功能需求清单
  • 网站内部数据搜索怎么做wordpress在php下安装教程视频
  • 4-GGML:看一下加法算子!
  • TypeVariable 检测与转换 type instanceof TypeVariable (TypeVariable<?>) type
  • 做搜狗手机网站排joomla做的网站
  • Android Hilt教程_构造函数
  • 花都个性设计商城网站建设wordpress 优酷插件
  • NCP13992中文版手册 工作原理
  • 网站建设三亚做一个网站得多少钱
  • 11.8 脚本网页 星际逃生
  • 用数据库做学校网站做ic芯片的要去哪个网站
  • 石油大学网页设计与网站建设天津塘沽爆炸视频
  • 建设银行反钓鱼网站影视网站怎么建设
  • leetcode 1611
  • 可信网站多少钱网站建设 网络科技
  • 电容充电:电子在极板上“分家囤货”,靠电场把电能“锁”起来
  • 做网站前怎么写文档phpcms模板下载
  • 在哪里创建网站平台自己的电脑如何做网站