题目类型:
该题属于字符串处理和边界条件处理的类型,重点考查字符串转换为整数的能力。
考点:
- 字符串遍历与处理:包括跳过前导空格、识别符号和有效数字的提取。
- 边界条件处理:处理整数转换中的溢出情况,确保结果在
INT_MIN
和INT_MAX
范围内。 - 错误处理与异常情况:如无有效数字、只有符号字符、溢出等情况的处理。
常见错误与注意点:
-
字符转换为数字的错误:
直接使用字符进行数学运算时,忘记将字符转换为对应的数字。例如,s[i] - '0'
是将字符s[i]
转换为对应的整数值。 -
溢出处理不当:
在累加数字时,如果不进行溢出检查,可能会导致结果溢出。例如,当result > (INT_MAX - digit) / 10
时,继续累加将导致超出INT_MAX
或INT_MIN
。 -
忽略空字符串或全空格字符串:
忽略了输入可能是空字符串或只包含空格的情况,这些情况需要返回0
。 -
符号处理错误:
在符号处理后,没有正确地将符号应用到结果上。例如,只考虑了正负号,但没有在最终返回时正确地反映符号。 -
无效字符处理:
遇到非数字字符时,没有正确停止转换。如果继续处理,将导致不正确的结果。
class Solution {
public:
// std::string getLastWord(const std::string& s) {
// size_t lastSpace = s.find_last_of(" \t\n\r\f\v");
// return (lastSpace == std::string::npos) ? s : s.substr(lastSpace + 1);
// }
// bool isPos(const std::string& s){
// return (s[0] == '-')? false : true;
// }
int myAtoi(std::string s) {
int i = 0, n = s.size();
// 1. 丢弃前导空格
while (i < n && s[i] == ' ') i++;
// 2. 检查符号
bool isNegative = false;
if (i < n && (s[i] == '-' || s[i] == '+')) {
isNegative = (s[i] == '-');
i++;
}
// 3. 转换数字并避免溢出
int result = 0;
while (i < n && isdigit(s[i])) {
int digit = s[i] - '0';
if (result > (INT_MAX - digit) / 10) { // 检查是否溢出
return isNegative ? INT_MIN : INT_MAX;
}
result = result * 10 + digit;
i++;
}
// 4. 应用符号
return isNegative ? -result : result;
}
};