首页 > 其他 > 详细

8.String to Integer (atoi)

时间:2020-05-16 15:41:22      阅读:51      评论:0      收藏:0      [点我收藏+]

给定一个字符串,将里面的数字提取出来。要注意空格、符号、int 数据越界、前导0。
Input: "4193 with words"
Output: 4193
Explanation: Conversion stops at digit ‘3‘ as the next character is not a numerical digit.

思路:
题目其实不难,难点在于要考虑的注意事项太多,容易混乱。应对 int 越界,用 long long来存储;应对空格,分为初始空格与非初始空格,加一个flag即可判断,初始空格跳过,非初始空格结束循环;应对符号,存在 “+-12” 这种多个符号,还有单个符号与无符号,也用flag区分;应对前导0,如“ -000000123”,将其跳过即可,但要先更新flag,防止“ -000+123”这种情况。

int myAtoi(string str) {
    int n = str.size(), sign = 1, flag = 0; //flag记录正负号个数
    long long ans = 0;
    for (int i = 0; i < n; i++) {
        if (str[i] ==   && flag == 0) continue; //初始空格跳过
        else if (str[i] == - || str[i] == +) { //处理符号
            if (flag++ > 0) break;
            else sign = str[i] == - ? -1 : 1; //sign = 1 or -1
        }
        else if (str[i] - 0 >= 0 && str[i] - 0 <= 9) { //处理数字
            flag = 1;
            if (str[i] == 0 && ans == 0) continue; //前导0跳过
            ans = ans * 10 + (str[i] - 0);
            if (ans > INT_MAX) return sign == 1 ? INT_MAX : INT_MIN; //是否超过int范围
        } 
        else break; //非数字与符号
    }
    return ans*sign;
}

总结:

flag为什么如此重要,因为 “符号只能出现在数字之前,初始空格只能出现在符号与数字之前”,所以初始flag = 0,而访问符号或者数字后就改变了flag,则此时再遇到空格或者符号,就跳出循环了。

 

8.String to Integer (atoi)

原文:https://www.cnblogs.com/luo-c/p/12900651.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!