相关笔记:整数反转
1.空格:读入字符串并丢弃前导空格–在循环外定义字符串下标,通过while循环判断前面的字符是否为“ ”,如果是,则i加一并进入下一次是否为空格的判断
2.符号:检查下一个字符为“-”还是“+”–通过if判断之后的字符有无符号,有则将sign标记为-1或1(在得出了最后的数字之后乘上),没有则默认为1
3.转换:跳过前置零,直至最后一个字符–这里的零不用单独写一条if语句来判断,可以通过与上一题相同的方法来解决(rev = rev *10 + d)。要注意的是,string使用【】得出的是char类型的字符,而不是整数,需要减去‘0’才能变为int类型
4.舍入:范围 [−231, 231 − 1]–在进行转换之前需要先对上一次的计算结果进行范围判断,如果大于INT_MAX/10或等于INT_MAX/10但是下一位大于7,则直接返回上一次的值(原因:如果上一次的值已经大于了INT_MAX/10,那么经过这次的循环之后,必然会超出范围;又因为最大值是231 − 1,因此在等于INT_MAX的情况下,个位最大值只能是7)
1int myAtoi(string s)
2 {
3 int i = 0, result = 0, sign = 1;
4 while(i < s.size() && s[i] == ' ') i++;
5 if(i == s.size()) return 0;
6 if(s[i] == '-' || s[i] == '+')
7 {
8 sign = s[i] == '-' ? -1 : 1;
9 i++;
10 }
11 while(i < s.size() && s[i] >= '0' && s[i] <= '9')
12 {
13 int digit = s[i] - '0';
14 if(result > INT_MAX / 10 || (result == INT_MAX / 10 && digit > 7))
15 return sign == 1 ? INT_MAX : INT_MIN;
16 result = result * 10 + digit;
17 i++;
18 }
19 return result * sign;
20 }
来源:语雀原笔记