LeetCode系列之【8. 字符串转换整数 (atoi)】C++ 每天一道leetcode!

目录(快速导航)

题目描述

视频讲解  https://www.bilibili.com/video/av66122790/

思路

代码


题目描述:

题目链接:https://leetcode-cn.com/problems/string-to-integer-atoi/

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0。

说明:

假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−2^{31},  2^{31} − 1]。如果数值超过这个范围,请返回  INT_MAX 或 INT_MIN  。

示例 1:
输入: "42"
输出: 42
示例 2:
输入: "   -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
     我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
示例 3:
输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。

视频讲解

https://www.bilibili.com/video/av66122790/

 

思路:

这道题挺简单的,我们只需要按照题目要求一步步做即可,需要知道的点:

  • char to int 的方式:int a = '4' - '0';因为这里本质上‘4’是char类型,对应ASCII表,它为52,所以不能直接将int a=‘4’,这其实a为52,只有int a=‘4’-‘0’,这是a才为4。
  • 注意不要超过int的界限【INT_MIN,INT_MAX】,即【-2147483648,2147483647】。

步骤:

说明:

  • 使用isbegin标识是否开始检测数字,初始化为0,表示未开始;
  • 使用isnegative标识是否为负数,初始化为0,表示为正数;
  • 使用out表示输出的int。
  1. 遍历str的所有字符c,
  2. isbegin为0,判断c是否为正负号与空格;正号:标记isbegin为1,负号:标记isbegin为1,isnegative为1,空格:跳过;
  3. 如果是数字:置isbegin为1,同时分正负数检测out是否溢出,没有溢出就加上值,溢出就用最大的边界值;
  4. 其余字符,就跳出循环
  5. 判断out是否为负数,纠正out的正负号
  6. 输出out

具体细节见代码。

 

代码:

class Solution {
public:
    int myAtoi(string str) {
        int isbegin=0; // 标识是否开始检测数字
        int isnegative=0; // 标识是否是负数 0表示正数 
        int out =0;// 输出的结果
        // 遍历str的所有字符c
        for(char c : str){
            // 首先查看是否是数字之前的正负号或者空格  注意:‘+-1’输出0
            if (isbegin == 0) {
                if (c == '-') {
                    isnegative = 1;
                    isbegin = 1;
                    continue;
                } else if (c == '+') {
                    isbegin = 1;
                    continue;
                } else if (c == ' ') {
                    continue;
                }
            }
            // 如果是数字
            if (isdigit(c) != 0) {
                isbegin = 1;
                // 是否超过正数最大值
                if (isnegative == 0 && ( out > INT_MAX / 10  || (out == INT_MAX / 10 && (c - '0') > 7))) {
                    out = INT_MAX;
                    break;
                }
                // 是否超过负数最大值
                else if (isnegative ==1 && (out > INT_MAX / 10 || (out == INT_MAX / 10 && (c - '0') >= 8))) {
                    out = INT_MIN;
                    break;
                }
                out = out * 10 - '0' + c;
                continue;
            }
            // 其余情况 包括:
            // 1. 首字符不是空格、正负号、数字
            // 2. 第一次出现正负号 之后出现除数字之外的字符
            // 3. 数字中间夹杂着除数字之外的字符
            else {
                break;
            }
        }
        // 检测是否是负数 
        // 此时out如果是负数 除了负数的最小值INT_MIN在上面直接赋值为负数外 
        // 其余都为正数,需要添加负号
        if (isnegative == 1 && out != INT_MIN) {
            out = 0 - out;
        }
        return out;
    }
};

取巧:

class Solution {
public:
    int myAtoi(string str) {
        int d=0;
        istringstream is(str);
        is>>d;
        return d;
    }
};

一起加油!!刷题!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值