Leetcode 8 字符串转换整数 学习感悟

思路:大体就是从串头开始读取每个数据,去除以下几种开头非法情况:

(1)若开头纯连续性空白符'  '需要吃掉所有的空白符再开始判断

(2)首字符必须是 + - 或者数字,若不是返回0

(3)非数字情形皆返回已读的res(res初始化为0)

举例如:

      读取数字过程中遇到如31.1415925的情况,读取到' . '时,应该将读取结果31返回。

      读取数字过程中遇到非数字的其他符号,如 +31ad234 当读取到' a '时,应该将结果31返回。

      读取数字过程中遇到如 +-43 的情况,读取到+时合法,读取到-时非数字返回res,res初始化是0。

整个思路:

   读取到' - '说明数字为负数,所以  res = res * 10 - (str.at(i) - '0');  这里用的减法

   读取到' + '说明数字为正数,所以  res = res * 10 + (str.at(i) - '0');  这里用的加法

其中对于res的溢出判断:(int 合法范围[  -2147483648 ,  2147483647   ])

    //MAX=2147483647                          //MIn=-2147483648

    正数情况: res>MAX/10  , 无论下面的字符串中的数字多小,一定溢出

                       res<MAX/10 , 无论下面的字符串中的数字有多大,一定不会溢出

                       res=MAX/10 ,当数字大于7时候就会溢出

     负数情况: (此时要考虑一下与逆转中的不同,本题res是负的,但是在str中读取的 str.at(i) - '0' 这个int 数字是正数

                      在逆转中的负数溢出判断条件为:

                                        res>MIN/10  , 无论下面的字符串中的数字有多大,一定不会溢出

                                         res<MIN/10 , 无论下面的字符串中的数字多小,一定溢出

                                         res=MIN/10  , 当数字小于-8时候就会溢出 ( 数字是-9就溢出 )

                        此题目负数溢出判断条件为:                     

                                         res>MIN/10  , 无论下面的字符串中的数字有多大,一定不会溢出

                                         res<MIN/10 , 无论下面的字符串中的数字多小,一定溢出

                                         res=MIN/10  , 当数字大于8时候就会溢出 ( 数字是9就溢出 )

       其实在读取的由于要开头的正负性不同,导致相加的时候均为正数为加法,负数为减法

        为了让代码趋于一致性,可以均用 res=res*10+ str.at(i) - '0'  ,在return  res时候加上正负号

        只不过在一开始不要给res正负性,只有当正数溢出至

                                 res > (INT32_MAX / 10)    ||  res == (INT32_MAX / 10)) && ((str.at(i) - '0') > 7)

        时候,根据第一个读取的 + - 号来判定。若正溢出,若负继续判定下列式子

                                 res > (INT32_MAX / 10)  ||  res == (INT32_MAX / 10)) && ((str.at(i) - '0') > 8)

        当负时,若满足此式则溢出,返回0

# include<iostream>
using namespace std;
int myAtoi(string str) {
	if (str.empty()||str=="")return 0;//空
	int ii = 0;
	bool f = false;
	while (str.at(ii++) == ' '&&ii<str.length());//一直排除空格
	if ((str.at(ii-1) != '-') && (!(str.at(ii-1) >= '0' && str.at(ii-1) <= '9'))&& (str.at(ii - 1)!='+'))return 0;//非数字或者正负号开头
	if (str.at(ii - 1) == '-')f = true;
	int res = 0;
	for (int i = ii - 1; i < str.length(); i++) {
		if (str.at(i) >= '0' && str.at(i) <= '9') {//数字的情形下
			if ((res > (INT32_MAX / 10)) || ((res == (INT32_MAX / 10)) && ((str.at(i) - '0') > 7)))return INT32_MAX;//正数溢出判定
			if ((res < (INT32_MIN / 10)) || ((res == (INT32_MIN / 10)) && ((str.at(i) - '0') > 8)))return INT32_MIN;//负数溢出判定 
			if (((res == (INT32_MIN / 10)) && ((str.at(i) - '0') > 8)))return INT32_MIN;
		//未溢出
			if (f) {
				c
			}
			else {
				res = res * 10 + (str.at(i) - '0');
			}
		}
		else if ((i == ii - 1) && (str.at(i) == '+' || str.at(i) == '-')) {//非数字要屏蔽第一个+-号
			;
		}
		else return res;
	}
	return res;
}

int  main(void) {
	cout << myAtoi("-2147483649") << endl;
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值