-
题目描述:
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-to-integer-atoi
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 -
解题思路:
先对开头的空格进行处理,把空格都消除,然后判断接着的这个字符是数字,“+”或者“-” 或者是其他的字符,如果是数字则直接进行后面的处理直到字符是非数字结束,如果是其他字符则直接返回0,这里要注意的是要考虑溢出的问题。 -
解题代码:
int myAtoi(string s) {
const int MAX = pow(2.0,31)-1;
const int MIN = (-1)*pow(2.0,31);
int len = s.size();
int i = 0;
int flag = 1;
long count = 0.0;
//1,丢弃前导空格
while(s[i] == ' '){
i++;
}
//2,判断正负号
if(i == len || isNumberOrSymbol(s[i]) == 0){
return 0;
}
if(s[i]=='-' || s[i] == '+'){
flag = flag * (',' - s[i]) ;
i++;
}
while( isdigit(s[i]) && i<len){
count = count*10 + (s[i] - '0');
//判断是否溢出
if(count > MAX && flag == 1){
return MAX;
}
if(count > MAX && flag == -1){
return MIN;
}
i++;
}
return count*flag;
}
//判断一个字符是否是数字或者是正负号 ascii码在48 ~ 57
int isNumberOrSymbol(char x){
int tmp = (int)x;
if(tmp>=48 && tmp <=57){
return 1;
}else if(x == '+' || x == '-'){
return 1;
}else{
return 0;
}
}
- tips:
在这个题目中会涉及到判断这个字符是“+”或者是“-”来进行flag的设置,可以利用“+”的ascii码是43,“ ,” 的是44,“ - ”的是45来进行简便的设置。
字符与字符直接相减的到的是着两个字符acsii码的差值(int型),可以利用 s[i] - '0 ’ 来将字符型数字转化成整形的数字。
//设置flag
if(s[i]=='-' || s[i] == '+'){
flag = flag * (',' - s[i]) ;
i++;
}