转换字符串到整数

问题:

实现atoi这个函数,将一个字符串转换为整数。如果没有合法的整数,返回0。如果整数超出了32位整数的范围,返回INT_MAX(2147483647)如果是正整数,或者INT_MIN(-2147483648)如果是负整数。

样例:

"10" =>10

"-1" => -1

"123123123123123" => 2147483647

"1.0" => 1

分析:

题目不能,只是各种细节处理要注意,代码有详细注释;

代码

class Solution {
public:
    int atoi(string str) {
        bool isNagitave = false;
		int i = 0;
		long long res = 0;

		// 去掉空白
		while(i < str.size() && str[i] == ' ') i++;

		// 判断符号
		if(i < str.size() && str[i] == '-') {
			isNagitave = true;
			i++;
		} else if(i < str.size() && str[i] == '+') {
			i++;
		}

		// 去掉前面的0
		while(i < str.size() && str[i] == '0') i++;

		int start = i; // 用于判断小数点是否是第一位
		// 计算数字
		while(i < str.size()) {
			if(str[i] >= '0' && str[i] <= '9') {
				res = res * 10 + (long long)(str[i] - '0');
				
				// 判断正数越界
				if(!isNagitave && res >= 0x7fffffff) {
					return 0x7fffffff;
				// 判断负数越界
				} else if(isNagitave && res >= (long long)0x7fffffff + (long long)1) {
					return 0x80000000;
				}
			} else if(str[i] == '.'){ // 判断小数点是否在正确的位置
				// 小数点不能是第一位也不能是最后一位
				if(i == str.size() - 1 || i == start) {
					res = 0;
				}
				// 遇到小数点就必须得停止
				break;
			} else{
			    // 遇到其他字符直接跳出,题目的测试用例是这样
			    // 例如:“    52lintcode”返回的就是52
				break;
			}
			i++;
		}

		res = isNagitave ? -res : res;

		return (int)res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值