LeetCode 8. String to Integer (atoi)

很经典的一道面试题

我直接看提示了...


1. leading spaec, 前导空格去掉

2. 之前可能出现一个的+, -符号

3. 若已读到了数值,则数值后出现的多余符号都不管,直接return

4. 若读到的数值越界,则返回INT_MAX(2147483647)或INT_MIN(-2147483648) —— 它们在climits头文件中

5. 输入中没有可转换数值 —— 即可选前导符号后没有数字出现,则无法转换,返回0.


代码:

class Solution 
{
public:
	int atoi(const char *str) 
	{
		int ret = 0;
		bool negative = false;

		for ( ; strlen(str)>0 && *str==' '; ++ str) {}
		if (strlen(str) == 0)
		{
			return 0;
		} else if (*str == '+' || *str=='-')
		{
			negative = *str=='-';
			++ str;
		}
		bool accpect_no_more_digit = false;
		bool accpect_no_large_digit = false;
		for ( ; strlen(str)>0 && *str<='9' && *str>='0'; ++ str)
		{
			if ( accpect_no_more_digit == true )
			{
				return ret>0? INT_MAX: INT_MIN;
			} else if (accpect_no_large_digit == true)
			{
				if ( ret>0 && *str<='7' )
				{
					ret = 10*ret + *str - '0';
				} else if ( ret<0 && *str<='8' )
				{
					ret = 10*ret - (*str - '0');
				} else
				{
					return ret>0? INT_MAX: INT_MIN;					
				}
			}
			else if (negative == false)
			{
				ret = 10*ret + *str - '0';
			} else 
			{
				ret = 10*ret - (*str - '0');
			}
			accpect_no_more_digit = ret>INT_MAX/10 || ret<INT_MIN/10;
			accpect_no_large_digit = ret==INT_MAX/10 || ret==INT_MIN/10;
		}

		return ret;
	}
};


我也会写atoi了 : P

你可能感兴趣的:(LeetCode,C++,String,atoi)