将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数(数值为0或者字符串不是一个合法的数值则返回0)。
输入描述 :输入一个字符串, 包括数字字母符号, 可以为空
输出描述 :如果是合法的数值表达则返回该数字,否则返回0
输入例子 :
+2147483647
1a33
输出例子 :
2147483647
0
分析:这个题刚拿到手的时候,有点懵。如果只是简单地将字符串“1234”输出成整数“1234”就完了的话,这个题就没有必要出了。认真想想,它考的是整个是对运行输入案例的包括性。所以,我们应该尽可能地考虑每一个可能发生的情况:
1.正负数的输出
2.含有字母字符
3.考虑数字过大或过小导致的溢出现象
4.字符串前面含有空格
class Solution {
typedef enum STATE //设置一个枚举类型来判别输入是否非法
{
VALID,
INVALID
}STATE;
STATE state = VALID; //先将状态置为合法
public:
int StrToInt(string str) {
int flag = 1; //设置符号标志
long long ret = 0; //考虑到返回值可能较大,定义为long long
const char* strch=str.c_str();
while(isspace(*strch)) //如果含有空格,指针就向后走
{
strch++;
}
if (*strch == '+') //如果是正数,不用处理
strch++;
if (*strch == '-') //如果是负数,将符号标志取反
{
flag = -flag;
strch++;
}
while(*strch)
{
if (isdigit(*strch)) //判断是否为数字
{
ret = ret * 10 + (*strch - '0')*flag;
if ((ret > INT_MAX) || (ret < INT_MIN)) //考虑溢出
{
ret = 0;
break;
}
strch++;
}
else //不是合法的数值
{
state = INVALID; //将状态置为非法
ret=0; //返回0
break;
}
}
return (int)ret;
}
};
总结:我们在模拟实现库函数时,并不能做到所有功能的实现,库函数在很多细节的处理上考虑得更全面。在《剑指offer》中,这是个面试题,面试者只顾埋着头写代码,写出来的当然不能使面试官满意。如果是在面试,一定要和面试官进行沟通交流,看面试官希望我们怎么去处理这些细节。这就好比让你实现一个需求,而你自己都不清楚需求到底是怎么回事,这怎么可能写出来让人满意的产品。