热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

leetcode8.StringtoInteger(atoi)&探讨补码运算溢出

题意:实现atoi函数,各种细节如下1.字串为空或者全是空格,返回0;2.字串的前缀空格需要忽略掉;3.忽略掉前缀空格后,遇到的第一个字符,如果是‘&

题意:实现atoi函数,各种细节如下

1. 字串为空或者全是空格,返回0; 

2. 字串的前缀空格需要忽略掉;

3. 忽略掉前缀空格后,遇到的第一个字符,如果是‘+’或‘-’号,继续往后读;如果是数字,则开始处理数字;如果不是前面的2种,返回0;

4. 处理数字的过程中,如果之后的字符非数字,就停止转换,返回当前值;

5. 在上述处理过程中,如果转换出的值超出了int型的范围,就返回int的最大值或最小值。

关键点:如何判断溢出,关于有符号数加法,乘法的溢出判断


class Solution {
public:
int myAtoi(string str) {
int len = str.length();
int i = 0;
//i指向第一个非空字符
while(str[i]==' ' && i//全是空格,则返回零
if (i==len) return 0;
//符号位
int sign = 1;
if (str[i]=='-') sign = -1;
int res = 0;
//数字带有正负号
if(str[i]=='-'||str[i]=='+'){
i++;
}
//以数字开头
if(str[i]>='0' && str[i]<='9'){
while(iif (str[i]>='0' && str[i]<='9'){
if (res>(INT_MAX-(str[i]-'0'))/10)//溢出了
return (sign == 1)?INT_MAX:INT_MIN;
else
res = res*10+(str[i]-'0');
}
else
return (sign == 1)?res:-1*res;
i ++;
}
return (sign == 1)?res:-1*res;
}
//不以'+','-',数字开头,则返回0
return 0;
}
};

判断溢出的正确写法:

if (res>(INT_MAX-(str[i]-'0'))/10)//溢出了
错误写法1
if (res<0)//溢出了    return (sign == 1)?INT_MAX:INT_MIN;
说明:只有x+y,也即补码加法,才能通过符号位来判断是否溢出,对于x+y,如果x,y很大时,就会得出负值。但是对于补码乘法,没有这个性质。


说明:x,y都是w位的,s=x*y,s可能需要不止(w+1)来表示。

错误写法2:

if (res*10+(str[i]-'0')>INT_MAX)//溢出了
return (sign == 1)?INT_MAX:INT_MIN;
说明:res*10本身已经溢出了,所以,即使res*10+(str[i]-'0')的真实值大于INT_MAX,但是其溢出值不一定大于INT_MAX.




推荐阅读
  • v8对象机制1.概述v8中每一个API对象都对应一个内部实现对象(堆对象)2.对象创建过程(1)v8::internal::Factory类: ... [详细]
  • 加号与加等于的区别publicclass加号与加等于{publicstaticvoidmain(String[]args){bytea5; ... [详细]
  • fzu 1715 Ball and Box n个不同的求放到m个不同的盒子中方法的个数
    1715BallandBoxAccept:120Submit:288TimeLimit:1000mSecMemoryLimit:32768KBProblem ... [详细]
  • ProblemDescriptionXiaoAlivesinavillage.Lastyearfloodrainedthevillage ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C语言:(1)整数是没有小数部分的数字(2)int类型在计算机中以二进制补码形式储存。(3)早期的整形在内存中占2字节,现代计算机中大多占4字节,取&# ... [详细]
  • [线段树|平衡树|树状数组]LightOJ - 1087 - Diablo
    1087-DiabloPDF(English)StatisticsForum ... [详细]
  • SCJP认证全称为SUN认证Java程序员,是Java认证系列中最基础的一门认证。要通过Java的其他认证,必须先通过SCJP认证(SCEA认证除外)。即使SUN被Oracle收购 ... [详细]
  • 自动调整列的宽度functionDBGridRecordSize(mColumn:TColumnEh):Boolean;{返回记录数据网格列显示最大宽度是否成功}beginResu ... [详细]
  • 一、MyEclipse中的一些常用的快捷键:ctrl+shift+x大写ctrl+shift+y小写alt+内容提示写住方法的时候可以先写main然后按alt+就可以了ctrl+1 ... [详细]
author-avatar
A198806192616
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有