LeetCode-8-string-to-integer-atoi

一、题目

实现atoi,将字符串转化乘int类型的数

int myAtoi(string str)函数,返回值为转化后的数,参数为需要转化的str

题目链接:https://leetcode.com/problems/string-to-integer-atoi/description/

二、实现

重点在于string的情况能不能考虑得比较周全

可能考虑不到的情况

1、开头有空格,返回后面的数字,如“     123”返回123

2、有一个或多个‘+’或‘-’,返回0

3、超过int范围时,大于INT_MAX返回INT_MAX,小于INT_MIN返回INT_MIN

4、如果数字中间有一个非数字字母,返回前面的一部分,如“123e23”返回123

int myAtoi(string str) {
	long long num = 0;
	int sign = 1;
	bool readnum = false;
	for (auto c : str) {
		int c_num = 0;

		if (readnum == false && c == ' ')
			continue;
		//判断第一个字母的正负性
		if (readnum == false&& (c == '+' || c == '-')) {
			if (c == '-')
				sign = -1;
			readnum = true;
			continue;
		}
		readnum = true;
		/*
		switch (c)
		{
		case '1':c_num = 1;break;
		case '2':c_num = 2;break;
		case '3':c_num = 3;break;
		case '4':c_num = 4;break;
		case '5':c_num = 5;break;
		case '6':c_num = 6;break;
		case '7':c_num = 7;break;
		case '8':c_num = 8;break;
		case '9':c_num = 9;break;
		case '0':c_num = 0;break;
		default:
			return num * sign;
		}
		*/
		if (c >= '0' && c <= '9') 
			c_num = c - '0';
		else
			return num * sign;
		if ((num * 10 + c_num) * sign > INT_MAX )
			return INT_MAX;
		if ((num * 10 + c_num) * sign < INT_MIN)
			return INT_MIN;
		num = num * 10 + c_num;
	}
	return num * sign;
}

三、本题总结

1、使用long long类型的数先来存取中间结果,在运算前和INT_MAX和INT_MIN进行比较,可以有效防止溢出的情况,在第七题中也用到了这种方式(但是第七题中没有加上尾数,所以情况还没有考虑完善,宁外,判断可以改到循环末尾来做,这样更加简洁)

2、效率问题,使用for(auto i: str)要优于for(int i=0;i<str.size();i++)

3、关于char转成int的方法,最开始使用的是switch,不仅运行速度慢,而且麻烦,实验c-‘0’的方式很方便,关键在于c++语言int和char的关系还是不够熟练。

原文地址:https://www.cnblogs.com/likaiming/p/8029810.html