49、字符串转化为整数 可以再刷一次
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1
输入
+2147483647 1a33
输出
2147483647 0
1、自己思考的一种笨方法,这题用C++ AC 不了
负数 -1234,正数 +2563的情形 第一个为正负号 要考虑到
第一位为0的也是不是合法的
出现0~9之外的字符也是不合法的
int StrToInt(string str) { long long num = 0; if (str.size() == 0) return 0; int len = str.size(); bool isNegative = false,isPositive = false; if (str[0] == '-') isNegative=true; else if (str[0] == '+') isPositive = true; else if (str[0]<='0' || str[0]>'9') return 0; int i = 0; if (isPositive || isNegative) i = 1; for ( ; i <len ; ++i) { if (str[i]<'0' || str[i]>'9') return 0; else { num = num * 10 + str[i] - '0'; } } if (isNegative) num = -1 * num; if (num <= INT_MAX && num >= INT_MIN) return num; return 0; }
只通过85.71%的案例。
2、第二种精简一点的方法
int StrToInt(string str) { int len = str.size(); if (len == 0) return 0;//为空,直接返回即可 int i = 0, flag = 1,isSingal = 0;// 索引 正负号标志位 正负号出现次数 long res = 0; //默认flag = 1,正数 while (i<len && str[i] == ' ') i++; //若str全为空格,str[i] = '\0'(最后一个i) if (i >= len) return 0;//全部都是空格,直接返回吧 if (i < len && str[i] == '-') { flag = -1; ++i; isSingal++; } if (i < len && str[i] == '+') { ++i; ++isSingal; } if (isSingal > 1) return 0; for ( ; i < len ; ++i) { if(str[i]<'0' || str[i] > '9') return 0; res = res * 10 + (str[i] - '0'); if (res >= INT_MAX && flag == 1) return INT_MAX; if (res > INT_MAX && flag == -1) return INT_MIN; } return flag * res; }
3、有很多要注意的地方
int StrToInt(string str) { int len = str.size(); if (len == 0) return 0; int flag=1,singal=0, i = 0; long long num = 0; while (i < len && str[i] == ' ') i++;//可能一直为空或者前面若干都是 空格,处理空格 if (i >= len) return