剑指Offer67.把字符串转换成整数

  • 题目:剑指Offer67.把字符串转换成整数
    实现stoi;
    无法转换的情况,return 0:① str为空 ② 只有空格 ③ 没有数字 ④ 第一个有效字符不是正负号或者数字
    若数值超过int的范围,就返回INT_MIN和INT_MAX,根据第一个有效字符位’+’,’-'决定,若没有正负号,按正数算;

  • 思路:
    1.模拟遍历:时间O(n):最多需要遍历一次,如果无法转换的话,会在中间结束,空间O(1)

class Solution {
public:
    int strToInt(string str) {
        if (str.empty()) return 0;
        
        int n = str.size();
        int i = 0;
        while (i < n && str[i] == ' ') ++i;//跳过开头空格;
        if (str[i] == ' ') return 0;//str只有空格

        int symbol = 0;//标识正负号
        if (str[i] == '+') {
            symbol = 1;
            if (++i < n && !(str[i] >= '0' && str[i] <= '9')) return 0;//正负号后面没数字
        } 
        else if (str[i] == '-') {
            symbol = -1;
            if (++i < n && !(str[i] >= '0' && str[i] <= '9')) return 0;//正负号后面没数字
        }
        else if (str[i] >= '0' && str[i] <= '9') ;
        else return 0; //第一个有效字符不是'+','-',数字
        
        long res = 0;//结果
        int maxVal = INT_MAX;//边界值
        for (; i < n; ++i) {//初始i一定停在第一个数字上
            if (str[i] >= '0' && str[i] <= '9') {
                res = res * 10 + (str[i] - '0');
                if (res > maxVal) {//我们跳过了符号,都是按正数算的,最后再考虑正负号
                    if (symbol == 0 || symbol == 1) return INT_MAX;//没出现+-号就默认按正数算
                    else return INT_MIN;
                } 
            }
            else break;//出现数字以外的其他字符就停止
        }

        return (symbol == 0 || symbol == 1) ? res : (-1) * res;//没出界的int值,根据符号输出正数/负数
    }
};
  • 总结:
    atoi和stoi:差别在于参数不同,stoi参数是string,atoi是const char*,但二者都可以转成 int ,long,long long,只需把to后面改成i,l,ll即可
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值