【leetcode】8-字符串转换整数【C++】

题目如下:

解题思路:

       这道题的关键在于准确理解题意,要求的是第一次出现正号或负号后连续的尽可能多的数字串。需注意以下几点:

  • 注意跳过字符串开头的空格。
  • 注意转换后的数字字符串的数值溢出。
  • 注意第一次遇见非数字字符、非正负号、非空格时,无法转换,直接返回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;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值