解题思路:
两个辅助函数
1 判断[left,right]范围内字符串是否有效,即是否存在数字以外的字符,存在就返回false。
2 假如上面的函数判断字符串有效,将[left,right]范围内的字符串转换成整数。
接下来只要确定边界left和right就可以了,right就是str的长度-1,即最后一个元素的下标;因为str[0]是’+‘或’-‘也是合法的,所以假如str[0]是’+‘或’-’,left就是1,否则left就是0。并且根据str[0]的符号可以确定整数的正负,用flag来记录正负1/-1;
class Solution {
public:
int StrToInt(string str) {
//空串返回0
int n=str.size();
if(n==0)
return 0;
//考虑开头的正负号
int flag=1;
int left=0;
if(str[0]=='+'){
flag=1;
++left;
}
if(str[0]=='-'){
flag=-1;
++left;
}
//假如[left,n-1]字符串有效,计算数组;否则返回0
int res;
if(isValidString(str,left, n-1)){
res=flag*toNumber(str,left,n-1);
}else{
res=0;
}
return res;
}
//检查[left,right]范围内是否有非法字符
bool isValidString(const string& str,int left,int right){
if(left>right)
return false;
while(left<=right){
if(str[left]<'0'||str[left]>'9')
return false;
++left;
}
return true;
}
//计算[left,right]范围内字符串转换为整数的值
int toNumber(const string& str,int left,int right){
int number=0;
for(int i=left;i<=right;++i)
number=number*10+(str[i]-'0');
return number;
}
};