题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1
输出
复制2147483647 0
解题关键点:对于字符类型的数字,该字符数字-'0'即为对应的整数类型对应的ASCII码值
刚开始的代码:太过冗余,且没有考虑溢出的情况
class Solution { public: int StrToInt(string str) { int len = str.length(); if(len == 0) return 0; int sum = 0; int number = 0; for(int i=1;i<len;i++){ if(str[i]<'0' || str[i]>'9')//注意这里是str[i]<'0',而不是str[i]<"0",已经是一个字符了 return 0; else{ number = str[i] - '0'; sum += number*pow(10.0, len-i-1);//这里可以优化为 sum * 10 + number } } if(str[0]=='+') return sum; else if(str[0]=='-') return -sum; else if(str[0]>='0' && str[0]<='9'){ number = str[0] - '0'; sum += number*pow(10.0, len-1); return sum; } else return 0; } };
可能会出现异常的情况:
1.是否为空字符串
2. 是否会溢出
3. 第一个字符是正负号还是数字
优化后代码:
class Solution { public: int StrToInt(string str) { int len = str.length(); if(!len) return 0; int flag = 1;//判断是正数还是负数 long long sum = 0; if(str[0]=='-') flag = -1; for(int i = (str[0]=='+'||str[0]=='-')?1:0;i<len;i++){ if(str[i]<'0' || str[i]>'9') return 0; else{ sum = sum*10+(str[i]-'0'); if(sum<0)//如果出现为负的情况说明溢出 return 0; } } return sum * flag; } };
在leedcode中题目要求比较多,因此又进行了修改:
class Solution { public: int strToInt(string str) { int len = str.length(); if(!len) return 0; int flag = 0;//判断是正数还是负数 long sum = 0; int i= 0; int number = 0; //去除开头空格 while(str[i]==' ') i++; while(str[i]<'0' || str[i]>'9'){ if(str[i]=='-'&&flag==0) flag = -1; else if(str[i]=='+'&&flag==0) flag = 1; else return 0; i++; } if(flag==0) flag = 1; for(;i<len;i++){ if(str[i]<'0' || str[i]>'9'){ break; } else{ number = str[i]-'0'; if(flag==1 && ((2147483647-number)/10<sum || 214748364<sum)){ return 2147483647; }else if(flag==-1 && ((2147483648-number)/10<sum || 214748364<sum)){ return -2147483648; }else{ sum = sum*10+(str[i]-'0'); } } } return sum * flag; } };