题目如下:
解题思路:
这道题的关键在于准确理解题意,要求的是第一次出现正号或负号后连续的尽可能多的数字串。需注意以下几点:
- 注意跳过字符串开头的空格。
- 注意转换后的数字字符串的数值溢出。
- 注意第一次遇见非数字字符、非正负号、非空格时,无法转换,直接返回0。
- 当出现数字前同时出现正号与符号时,无法转换,直接返回0。例如:++-7789,应直接返回0
- 因为要求的是第一个正号或负号后的连续数字串,所以当正号或负号后的出现空格时直接返回。例如:+ 33,应返回0。
- 因为要求的是第一个正号或负号后的连续数字串,所以当数字串后再出现其他非数字字符时(包括空格)需要舍去后面。例如:+598734 453,应返回598734;-3.14159,应返回-3;520ssd789,应返回520。
代码如下:
class Solution {
public:
int myAtoi(string str) {
int length = str.size();
int sign = 1; //为0表示负数,为1表示正数
int flag = 0; //标记是否遇到数字,为0表示还未遇到数字
int pos_flag = 0; //记录遇到的正号次数,用于避免出现+-5这种情况
int neg_flag = 0; //记录遇到的负号次数,用于避免出现+-5这种情况
long long res = 0;
if(length == 0) //字符串为空
return 0;
for(int i = 0; i < length; ){
//处理空格
if(str[i] == ' ' && flag == 0 && pos_flag == 0 && neg_flag == 0) //跳过首次出现数字、正负号前的空字符
i++;
//处理正号、负号
else if(str[i] == '-' && flag == 0 && pos_flag == 0 && neg_flag == 0){ //除空格外,第一次遇到负号
sign = 0;
neg_flag = 1;
i++;
}
else if(str[i] == '-' && flag == 0 && pos_flag != 0) //出现数字前,遇到多个正、负号,则直接结束
return 0;
else if(str[i] == '+' && flag == 0 && neg_flag == 0 && pos_flag == 0){ //除空格外,第一次遇到正号
pos_flag = 1;
i++;
}
else if(str[i] == '+' && flag == 0 && neg_flag != 0) //出现数字前,遇到多个正、负号,则直接结束
return 0;
//处理第一次遇见的非数字字符
else if((str[i] < '0' || str[i] > '9') && flag == 0) //第一次遇到数字前的非数字、非正负号字符(空字符已在最开始处理,当正负号后面再次出现空格时应当做不能转换处理)
return 0;
//处理连续数字串
else if(str[i] >= '0' && str[i] <= '9'){ //第一次遇见的是数字
flag = 1;
res = res*10 + str[i] - '0';
if(res > INT_MAX && sign == 1) //res本身只记录数值,溢出则直接退出
return INT_MAX;
else if(res > INT_MAX && sign == 0)
return INT_MIN;
i++;
}
else if((str[i] < '0' || str[i] > '9') && flag != 0){ //遇见数字后又遇见其他非数字字符,直接舍去后面,因为需要的是连续数字串
if(sign == 0)
return res * (-1);
else
return res;
}
else //跳过第一次遇见数字前的非数字字符、非正负号
i++;
}
if(sign == 0)
return res * (-1);
else
return res;
}
};