⭐算法入门⭐《模拟》中等01 —— LeetCode 8. 字符串转换整数

文章目录

  • 一、题目
    • 1、题目描述
    • 2、基础框架
    • 3、原题链接
  • 二、解题报告
    • 1、思路分析
    • 2、时间复杂度
    • 3、代码详解
  • 三、本题小知识
  • 四、加群须知

一、题目

1、题目描述

  实现一个myAtoi(string s)函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string s) 的算法如下:
  1)读入字符串并丢弃无用的前导空格;
  2)检查下一个字符为正还是负号,读取该字符。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
  3)读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。将前面步骤读入的这些数字转换为整数。如果没有读入数字,则整数为 0 。
  4)如果整数超过 32 位有符号整数范围 [ − 2 31 , 2 31 − 1 ] [−2^{31}, 2^{31} − 1] [231,2311],需要截断这个整数,使其保持在这个范围内。具体来说,小于 − 2 31 −2^{31} 231 的整数应该被固定为 − 2 31 −2^{31} 231 ,大于 2 31 − 1 2^{31} − 1 2311 的整数应该被固定为 2 31 − 1 2^{31} − 1 2311
  返回整数作为最终结果。
  样例输入1: “+123”
  样例输出1: 123

  样例输入2:"   -123"
  样例输出2: − 123 -123 123

  样例输入3: “hahaha 996”
  样例输出3: 0

  样例输入4:"-9231243283324473242332",
  样例输出4: -2147483648

  样例输入5: “-+1”
  样例输出5: 0

2、基础框架

  • c++ 版本给出的基础框架代码如下,给定一个字符串,返回一个整数。
class Solution {
public:
    int myAtoi(string s) {
    }
};

3、原题链接

LeetCode 8. 字符串转换整数 (atoi)

二、解题报告

1、思路分析

  这个就是一个典型的模拟题,题目很简单,就是给定一个字符串,我们需要将它转换成整型返回。然而要考虑很多的点,接下来我们一一分析:
  1)需要去除前导空格;
  2)判断第一个字符:
   2.a)如果第 1 个符号是'+',则取从第 2 个符号开始的子串;
   2.b)如果第 1 个符号是'-',则取从第 2 个符号开始的子串,并且记录符号位;
   2.c)否则,什么都不做;
  3)遍历得到的字符串,不断计算累加和,如果等到的数超出int范围,按照最大值还是最小值分情况返回,或者遇到不是数字的字符,就跳出循环;
  4)返回当前的累加和 乘上 符号位 的结果。

2、时间复杂度

  • 基本所有的操作都是一层for循环枚举,所以时间复杂度为 O ( n ) O(n) O(n)

3、代码详解

class Solution {
public:
    string trim(string s) {                               // (1)
        string ret;
        int notEmptyIdx = s.size();
        for(int i = 0; i < s.size(); ++i) {
            if( s[i] == ' ' ) {
                continue;
            }else {
                notEmptyIdx = i;
                break;
            }
        }
        for(int i = notEmptyIdx; i < s.size(); ++i) {
            ret.push_back( s[i] );
        }
        return ret;
    }
    string positiveCheck(string s) {                      // (2)
        string ret;
        for(int i = 1; i < s.size(); ++i) {
            ret.push_back(s[i]);
        }
        return ret;
    }
    string negtaiveSplit(string s, int &flag) {           // (3)
        if(s.size() == 0) {
            flag = 1;
            return s;
        }
        if(s[0] == '-') {
            flag = -1;
            string ret;
            for(int i = 1; i < s.size(); ++i) {
                ret.push_back(s[i]);
            }
            return ret;
        }
        flag = 1;
        return s;
    }

    int myAtoi(string s) {
        int flag = 1;
        long long sum = 0;                              // (4)
        s = trim(s);
        if(s.size() == 0) {
            return 0;
        }

        if(s[0] == '+')
            s = positiveCheck(s);
        else if(s[0] == '-')
            s = negtaiveSplit(s, flag);

 
        long long minv = INT_MIN;
        long long maxv = INT_MAX;
        for(int i = 0; i < s.size(); ++i) {
            if(s[i] >= '0' && s[i] <= '9') {
                sum = sum * 10 + s[i] - '0';
                if(sum * flag < minv) {
                    return minv;                       // (5)
                }
                if(sum * flag > maxv) {
                    return maxv;                       // (6)
                }
            }else {
                break;                                 // (7)
            }
        }
        return sum * flag;                             // (8)

    }
};
  • ( 1 ) (1) (1) string trim(string s)这个函数就是传入字符串s,返回一个去掉前导空格的字符串,这一步的时间复杂度为 O ( n ) O(n) O(n)
  • ( 2 ) (2) (2) string positiveCheck(string s)函数的作用,是去掉第一个字符为'+'的情况,并且返回字符串,这一步的时间复杂度也为 O ( n ) O(n) O(n)
  • ( 3 ) (3) (3) string negtaiveSplit(string s, int &flag)函数的作用,是对于负数的处理,将符号存储到 flag变量中,并且通过引用返回。
  • ( 4 ) (4) (4)long long是因为需要考虑int越界的情况;
  • ( 5 ) (5) (5) 超过int最小值;
  • ( 6 ) (6) (6) 超过int最大值;
  • ( 7 ) (7) (7) 出现非法符号;
  • ( 8 ) (8) (8) 考虑负数的存在,所以需要乘上flag

三、本题小知识

int越界的情况,可以使用long long来化解。


四、加群须知

  相信看我文章的大多数都是「 大学生 」,能上大学的都是「 精英 」,那么我们自然要「 精益求精 」,如果你还是「 大一 」,那么太好了,你拥有大把时间,当然你可以选择「 刷剧 」,然而,「 学好算法 」,三年后的你自然「 不能同日而语 」
  那么这里,我整理了「 几十个基础算法 」 的分类,点击开启:

算法入门指引

  如果链接被屏蔽,或者有权限问题,可以私聊作者解决。

  大致题集一览:


在这里插入图片描述


  为了让这件事情变得有趣,以及「 照顾初学者 」,目前题目只开放最简单的算法 「 枚举系列 」 (包括:线性枚举、双指针、前缀和、二分枚举、三分枚举),当有 一半成员刷完 「 枚举系列 」 的所有题以后,会开放下个章节,等这套题全部刷完,你还在群里,那么你就会成为「 夜深人静写算法 」专家团 的一员。
  不要小看这个专家团,三年之后,你将会是别人 望尘莫及 的存在。如果要加入,可以联系我,考虑到大家都是学生, 没有「 主要经济来源 」,在你成为神的路上,「 不会索取任何 」
  联系作者,或者扫作者主页二维码加群,加入刷题行列吧


让天下没有难学的算法

C语言免费动漫教程,和我一起打卡!
光天化日学C语言

入门级C语言真题汇总
C语言入门100例

几张动图学会一种数据结构
画解数据结构

组团学习,抱团生长
算法入门指引

竞赛选手金典图文教程
夜深人静写算法

你可能感兴趣的:(《LeetCode算法全集》,算法,leetcode,模拟,字符串转换整数)