一:题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
输入
+2147483647 1a33
输出
2147483647 0
二:解题思路
刚看到题的是有以为很简单,只要判断字符串中是否存在除0--9以外的字符,如果有,返回0,如果没有返回转换后的字符串
错错错!!!
这道题其实考察了很多细节
对于字符串不合法的情况你能想到哪些
1.空字符串
2.包括0--9以外的字符
3.转换为整数的过程中,数字超过int类型的范围
4.只包含+-号
同时还有一个容易被忽略的地方,当字符串不合法,返回0,他与字符串只包含‘0’,返回数字0,怎么区别呢/?
采用全局变量的方式,true 代表字符串合法,返回的0是数字0,false代表返回的字符串不合法,0代表不合法
三:代码实现
class Solution {
public:
//考虑str为空字符串,只有加减号,数太大溢出,包括其他符号
//不合法字符返回的0,与真实数字返回的0,怎么区别
bool isLegal=false;//true 代表返回的0是数值, false 返回的的0 代表输入的字符串是非法的
int StrToInt(string str) {
if(str.length()==0 ) //str不可以与null 比较,null一般只与char *比较
return 0; //str.length()==0 ,str=="" str.empty()表示的含义是是等价的
//if(str == null ||str.length()==0){ //所以str==null会报错
//return 0;
//}
if(str.length()==1 && (str[0]=='+' || str[0]=='-'))
return 0;
int i=0;//记录str当前位置
//判断第一位是否位+-
bool symbol=true; //ture:+ false:-
if(str[0]=='+')
i++;
if(str[0]=='-'){
i++;
symbol=false;
}
int digit=0;
for(i;i<str.length();i++){
if(str[i]>='0' && str[i]<='9')
digit=digit*10+(str[i]-'0');
else
return 0; //出现0--9以外的字符,该字符串不合法,返回0,同时 isLegal=false
// if(symbol && digit>0x7FFFFFFF)
//return 0; //
// if(!symbol && (-1*digit)<0x80000000)
// return 0;
//记住每种类型的范围,很繁琐,C++提供了现成的宏定义
if(symbol && digit>INT_MAX)
return 0; //(signed int ) //作用?
if(!symbol && (-1*digit)<INT_MIN)
return 0;
}
//遍历到字符串的最后,合法字符
if(str[i]=='\0')
isLegal=true;
if(!symbol)
return 0-digit;
else
return digit;
}
};