首先,字符串中可能出现的字符包括空格、数字、正负号、大小写字母、标点符号
并且 如果字符串内有数字,如果不是在最开始,那么在中间的数字也不算有效的、可转换的,所以第一个非空字符要么是负号‘-’,要么是数字
a按照自己的理解,写了一份:
class Solution {
public:
int strToInt(string str) {
int len_str = str.size();
if(len_str == 0)return 0; //空字符串
int i = 0;
int sign_flag = 1;
while(i < len_str && str[i]==' ')i++;
if( i == len_str)return 0; //只包含空白字符
if((str[i]>='a' && str[i]<='z') || (str[i]>='A' && str[i]<='Z'))return 0; //是大小写字母
if( str[i] == '-'){
sign_flag = -1;
i++;
}
else if( str[i] == '+'){
sign_flag = 1;
i++;
}
string s_to_int;
while( i < len_str && str[i] == '0')i++;
while( i < len_str && (str[i] - '0')>=0 && (str[i] - '0')<=9 ){
// s_to_int.append(str[i]);
s_to_int+=str[i];
i++;
}
long long int_from_str = 0;
// int_from_str = (s_to_int - "0")*sign_flag;
// 字符串s_to_int转成数字int_from_str,需要区分个位、十位等
long long digit = 1;
int ll = s_to_int.size();
for( int j = ll-1 ; j >=0 ; j-- ){
char c = s_to_int[j];
int_from_str += (c-'0')*digit;
digit *= 10;
}
int_from_str *= sign_flag;
if( int_from_str >= INT_MAX)return INT_MAX;
if( int_from_str <= INT_MIN)return INT_MIN;
return (int)int_from_str;
}
};
但是对于有很多0的情况比如 s = " 0000000000012345678"以及超过32位整数表示范围的这种情况 这份code还handle不了:
就是应该怎么处理越界呢?
题解面试题67. 把字符串转换成整数(数字越界处理,清晰图解) - 把字符串转换成整数 - 力扣(LeetCode) (leetcode-cn.com)
而且这里有一点和我之前写的思路不一样的地方还在于如何从纯数字字符串得到对应的数字,我之前写的是倒着加的,就是从个位开始加,这样会比较难判断如何越界,而如果从高位开始,每次×10,就更容易判定是否越界
class Solution {
public:
int strToInt(string str) {
int len_str = str.size();
if(len_str == 0)return 0; //空字符串
int i = 0;
int sign_flag = 1;
int bndry = INT_MAX/10; // -2147483648~2147483647
while(i < len_str && str[i]==' ')i++;
if( i == len_str)return 0; //只包含空白字符
if((str[i]>='a' && str[i]<='z') || (str[i]>='A' && str[i]<='Z'))return 0; //是大小写字母
if( str[i] == '-'){
sign_flag = -1;
i++;
}
else if( str[i] == '+'){
sign_flag = 1;
i++;
}
// string s_to_int;
long long int_from_str = 0;
// long long digit = 1;
// int ll = s_to_int.size();
while( i < len_str && str[i] == '0')i++;
while( i < len_str ){
if((str[i] - '0')>=0 && (str[i] - '0')<=9){
// s_to_int+=str[i];
if((int_from_str> bndry) || ((int_from_str==bndry)&& (str[i]>'7')))
return sign_flag == -1? INT_MIN:INT_MAX;
int_from_str = 10 * int_from_str + (str[i] - '0');
i++;
}
else break;
}
// for( int j = ll-1 ; j >=0 ; j-- ){
// char c = s_to_int[j];
// int_from_str += (c-'0')*digit;
// digit *= 10;
// }
int_from_str *= sign_flag;
// if( int_from_str >= INT_MAX)return INT_MAX; //如果能比较 那就能存储下了 所以这两句话没有意义orz
// if( int_from_str <= INT_MIN)return INT_MIN;
return (int)int_from_str;
}
};