剑指 Offer 67-把字符串转换成数字C++

题目描述

在这里插入图片描述
在这里插入图片描述

解法 逐个元素分析

关键就是要读懂题目要求
1.第一个非空字符必须是数字或者‘+’‘-’号。
2.从第一个非空字符开始直到数字结束就是所求数字。
边界情况:
1.当转换的数字是正数且超过INT 上限,直接转换为INT_MAX。
2.当转换的数字为负数且超过INT 上限,转换为 -INT_MAX,这里要注意负数的绝对值的最大值在补码中比正数大1。

if(ans >= INT_MAX && flag == 1) return INT_MAX;
//注意这里不是大于等于,负数补码的最大绝对值为整数最大值+1
if(ans > INT_MAX && flag == -1) return INT_MIN;

转换过程:
ans初始值为0
ans = ans * 10 + str[i] - ‘0’
比如数字 4231
ans = 0 * 10 + 4 = 4
ans = 4 * 10 + 2 = 42
ans = 42 * 10 + 2 = 423
ans = 423 * 10 + 1 = 4231

class Solution {
public:
    int strToInt(string str) {
        int flag = 1;
        long ans = 0;
        int index = 0;
        //i停留在第一个不是空格的地方
        while(str[index] == ' ') index++;
        if(str[index] == '-') {
            flag = -1;
            index++;
        }
        else if(str[index] == '+') index ++;
        //isdigital函数可以判断字符是不是数字
        for(; index < str.size() && isdigit(str[index]); index ++) {
            ans = ans*10 + (str[index] - '0');
            if(ans >= INT_MAX && flag == 1) return INT_MAX;
            //注意这里不是大于等于,负数补码的最大绝对值为整数最大值+1
            if(ans > INT_MAX && flag == -1) return INT_MIN;
        }
        return flag * ans;
    }
};

在这里插入图片描述
还有几年没用的isdigital函数,可以判断字符是否为数字字符
时间复杂度O(N)
空间复杂度O(1)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值