题目描述:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 示例1 : 输入 +2147483647 1a33
输出 2147483647 0
我的代码:
class Solution {
public:
int StrToInt(string str) {
bool g_statue = true; // 判断数值为 0, 还是字符串不是一个合法的字符 的全局状态量
bool flag_valid = true; // 判断字符串是否合法
int flag = 1; // 判断第一位是正是负
long long num = 0;
if(str.empty())
{
flag_valid = false; // 如果为空,不合法
}
if(str[0] == '0' && str.size() == 1) // 只有一个字符“0”,返回0
{
return 0; // 合法.状态变量 g_statue 不变
}
if(str[0] == '-')
flag = -1;
if(str[0] == '+')
flag = 1;
if(str[0] == '-' || str[0] == '+')
{
if(str.size() == 1)
{
flag_valid = false; // 如果只有一个正负号,则不合法
}
else
{
for(int i = 1;i < str.size();++i)
{
if(str[i] > '0' && str[i] < '9')
{
num = num * 10 + flag * (str[i] - '0');// 合法的情况
if(num > 0x7FFFFFFF || num <(signed int) 0x80000000)
{
flag_valid = false; // 数据溢出,则不合法
break;
}
}
else
{
flag_valid = false; // 如果任何一个字符串不在 ‘0’ ~ ‘9’ 之间,则不合法
break;
}
}
}
}
else // 不是以 +- 号开头,
{
for(int i = 0;i < str.size();++i)
{
if(str[i] > '0' && str[i] < '9')
{
num = num * 10 + flag * (str[i] - '0'); // 合法的情况
if(num > 0x7FFFFFFF || num <(signed int) 0x80000000)
{
flag_valid = false; // 数据溢出,则不合法
break;
}
}
else
{
flag_valid = false; // 如果任何一个字符串不在 ‘0’ ~ ‘9’ 之间,则不合法
break;
}
}
}
if(flag_valid == false) // 如果不合法
{
g_statue = false;
return 0;
}
else
return num;
}
};
分析:这一题的难点主要在于确定什么情况下为无效输入。无效输入应该有以下几种情况:
(1)、空字符串或者只有一个 + 或者 -;
(2)、每一个数值字符不在 '0' ~ '9' 之间。如果第一个字符是 + 或者 - ,则需要从str[1] 开始往后遍历。如果第一个符号不是 + ,那么需要从 str[0] 开始遍历
(3)、字符串合法,但是最后生成的整数溢出了
因为题目要求,当无效的输入时,返回 0 , 但是 如果是字符串“0”,也是返回 0 。所以要使用一个全局状态变量 g_statue 来进行区分
《剑指offer》 一书上给的参考答案,函数的形参是 char * ,反而处理起来简单一些 |