题目描述:
实现函数 atoi 。函数的功能为将字符串转化为整数
提示:仔细思考所有可能的输入情况。这个问题故意描述的很模糊(没有给出输入的限制),你需要自己考虑所有可能的情况。
这个题目之前在剑指offer上好像有类似的题,但是感觉leetcode上限制的条件更多,或者说给出的提示更少,需要自己考虑各种情况。
- 第一个字符是+,-,或者空格这样的字符时,应该怎么处理;
- 中间有字母的情况时怎么处理;对于这种情况,一开始的考虑是直接判定该字符串不符合条件返回,但是好像不能这样处理,需要输出字母前正确的数字;
- 数字越界怎么处理。这个问题在我的代码中并没有考虑到。
class Solution {
public:
int atoi(const char *str) {
int i=0;
int output=0;
while(str[i]=='+'||str[i]=='-'||str[i]==' '){
i++;
}
int j=i;
while(str[i]!='\0'){
if('0'<=str[i]&&str[i]<='9'){
output=output*10+str[i]-'0';
}
else break;
i++;
}
if(str[j-1]=='-')return (0-output);
else return output;
}
};
以上,待补充。。。(只通过了90%的测试用例)
来更新
对于这类问题,我们首先也需要知道需要输出的整数的正负号问题,所以可以提前设置一个标志位用于记录其符号。
对于数据溢出问题,在设置output时,将其数据类型设置为long long类型,long long类型数据,占8字节,64位, 而int型数据类型,占4字节,32位,取值范围位2147483647~-2147483648。当数据溢出时,直接赋值为取值范围内的最大或最小值即可。
修改后通过率100%的代码:
class Solution {
public:
int atoi(const char *str) {
int i=0;
int sign=0;
long long output=0;
while(str[i]=='+'||str[i]=='-'||str[i]==' '){
if(str[i]=='-'){
sign=-1;
}
i++;
}
while(str[i]!='\0'){
if('0'<=str[i]&&str[i]<='9'){
output=output*10+str[i]-'0';
if(output>INT_MAX){
if(sign<0){
return INT_MIN;
}
else return INT_MAX;
break;
}
}
else break;
i++;
}
if(sign<0)return (0-output);
else return output;
}
};
【心中有力量】