题目描述
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
提示:
- 在任何情况下,若函数不能进行有效的转换时,请返回 0 。
- 本题中的空白字符只包括空格字符 ' ' 。
- 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
示例 1:
输入: "42"
输出: 42
示例 2:
输入: " -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
示例 3:
输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。
示例 4:
输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
因此无法执行有效的转换。
考点
- 数学
- 字符串
解题思路
- 首先,去除字符前面的空格字符;
- 然后,对运算符(-, +)做特殊处理;
- 最后,计算结果;注意对
"4193 with words"
这种例子的处理;
代码实现
- 注意整形溢出的处理,
res
初始化为double
类型;
class Solution {
private:
bool isOperator(char ch){
if(ch == '+' || ch == '-')
return true;
else
return false;
}
public:
int myAtoi(string str) {
double res = 0;
bool flag = true;
// 去除空格
int i = 0;
for(; i < str.length(); i++){
if(str[i] == ' ')
continue;
else
break;
}
str = str.substr(i, str.length()-i);
//cout << str << endl;
// 开始计算结果
for(int i = 0; i < str.length(); i++){
if(i == 0 && !isdigit(str[i]) && !isOperator(str[i])) // 非数字和运算符开头
return 0;
else if(i == 0 && str[i] == '-')
flag = false;
else if(i == 0 && str[i] == '+')
flag = true;
else if(i == 1 && isOperator(str[i]) && isOperator(str[i-1]))
return 0;
else{
if(isdigit(str[i]))
res = res*10 + (str[i] - '0');
else
break;
}
}
if(!flag) res = -res;
if(res > INT_MAX) return INT_MAX;
if(res < INT_MIN) return INT_MIN;
return res;
}
};
网友评论