【C++经典例题】字符串转整数(atoi)的实现与解析

news2025/4/19 4:17:23

           💓 博客主页:倔强的石头的CSDN主页 

           📝Gitee主页:倔强的石头的gitee主页

            ⏩ 文章专栏:C++经典例题

                                  期待您的关注

 

目录

一、问题描述

二、解题思路

三、代码实现

四、代码逻辑详解

1. 变量初始化

2. 忽略前导空格

3. 处理符号

4. 转换数字

5. 返回结果


 

 

一、问题描述

LCR 192. 把字符串转换成整数 (atoi) - 力扣(LeetCode)

在编程中,经常会遇到将字符串转换为整数的需求,就像标准库中的 atoi 函数一样。

本题要求实现一个 myAtoi 函数,将输入的字符串转换为 32 位有符号整数,具体规则如下:

 

  1. 读入字符串并丢弃无用的前导空格。
  2. 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。确定最终结果是负数还是正数。如果两者都不存在,则假定结果为正。
  3. 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
  4. 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
  5. 如果整数数超过 32 位有符号整数范围 [−2^31, 2^31 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^31 的整数应该被固定为 −2^31 ,大于 2^31 − 1 的整数应该被固定为 2^31 − 1 。

二、解题思路

 

为了实现 myAtoi 函数,我们可以按照以下步骤进行:

  1. 忽略前导空格:从字符串的开头开始,跳过所有的空格字符,直到遇到第一个非空格字符。
  2. 处理符号:检查第一个非空格字符是否为 + 或 -,如果是 +,则结果为正数;如果是 -,则结果为负数;如果没有符号,则默认结果为正数。
  3. 转换数字:从符号字符之后开始,依次读取数字字符,将其转换为整数。如果遇到非数字字符,则停止读取。
  4. 溢出处理:在转换数字的过程中,需要检查是否会发生溢出。如果结果超出了 32 位有符号整数的范围,则需要截断结果。

 

三、代码实现

 

#include <iostream>
#include <string>
#include <climits>

class Solution {
public:
    int myAtoi(std::string str) 
    {
        int flag = 1;  // 正负号
        int i = 0;     // 下标
        int ret = 0;   // 结果
        int size = str.size(); 

        // 忽略前导空格
        while (i < size && str[i] == ' ') {
            ++i;
        }

        // 处理符号
        if (i < size && str[i] == '-') {
            flag = -1;
            ++i;
        } else if (i < size && str[i] == '+') {
            ++i;
        }

        // 转换数字
        while (i < size && str[i] >= '0' && str[i] <= '9') {
            int digit = str[i] - '0';
            // 检查溢出
            if (ret > (INT_MAX - digit) / 10) {
                return flag == 1 ? INT_MAX : INT_MIN;
            }
            ret = ret * 10 + digit;
            ++i;
        }

        return flag * ret;
    }
};

int main() {
    Solution sol;
    std::string input = "   -42";
    std::cout << sol.myAtoi(input) << std::endl;
    return 0;
}

四、代码逻辑详解

1. 变量初始化

 

  • flag:用于记录结果的正负号,初始值为 1,表示正数。
  • i:用于遍历字符串的下标,初始值为 0。
  • ret:用于存储转换后的整数结果,初始值为 0。
  • size:字符串的长度。

2. 忽略前导空格

while (i < size && str[i] == ' ') {
    ++i;
}

使用一个 while 循环,从字符串的开头开始,跳过所有的空格字符,直到遇到第一个非空格字符。

 

3. 处理符号

if (i < size && str[i] == '-') {
    flag = -1;
    ++i;
} else if (i < size && str[i] == '+') {
    ++i;
}

检查第一个非空格字符是否为 + 或 -。如果是 -,则将 flag 设为 -1,表示结果为负数;如果是 +,则直接跳过该字符;如果没有符号,则默认结果为正数。

 

4. 转换数字

while (i < size && str[i] >= '0' && str[i] <= '9') {
    int digit = str[i] - '0';
    // 检查溢出
    if (ret > (INT_MAX - digit) / 10) {
        return flag == 1 ? INT_MAX : INT_MIN;
    }
    ret = ret * 10 + digit;
    ++i;
}

使用一个 while 循环,从符号字符之后开始,依次读取数字字符。将字符转换为对应的数字 digit,并将其加入到结果 ret 中。在每次更新 ret 之前,检查是否会发生溢出。如果 ret 乘以 10 再加上 digit 会超过 INT_MAX,则根据 flag 的值返回 INT_MAX 或 INT_MIN

 

5. 返回结果

return flag * ret;

最后,将结果乘以 flag,得到最终的整数结果并返回。

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2332878.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库数据恢复——sql server数据库被加密怎么恢复数据?

SQL server数据库数据故障&#xff1a; SQL server数据库被加密&#xff0c;无法使用。 数据库MDF、LDF、log日志文件名字被篡改。 数据库备份被加密&#xff0c;文件名字被篡改。 SQL server数据库数据恢复过程&#xff1a; 1、将所有数据库做完整只读备份。后续所有数据恢…

C# 组件的使用方法

类 Stopwatch 计算时间 Stopwatch sw new Stopwatch(); sw.Start(); // 要执行的代码块 Thread.Sleep(2000);sw.ElapsedMilliseconds // 消耗时间 Console.WriteLine(sw.ElapsedMilliseconds);组件 ListView 属性设置 外观 - View - Details 行为 - Columns -&#xff08;…

QCustomPlot频谱图

使用QCutomPlot做的读取txt文件显示频谱图的demo,帮助大家了解QCustomPlot的基本使用 1.运行结果 demo比较简单,用于文件读取,鼠标放大缩小,右键截图等基础功能. 2.绘图详解 绘图核心是将类提升为QCustomPlot之后进行重绘,重绘之前设计图表曲线,图标标题,坐标轴,坐标轴范围,背…

高并发的业务场景下,如何防止数据库事务死锁

一、 一致的锁定顺序 定义: 死锁的常见原因之一是不同的事务以不同的顺序获取锁。当多个事务获取了不同资源的锁,并且这些资源之间发生了互相依赖,就会形成死锁。 解决方法: 确保所有的事务在获取多个锁时,按照相同的顺序请求锁。例如,如果事务A需要锁定表A和表B,事务…

【Grok 大模型深度解析】第二期:架构探秘与训练哲学

在上一期的内容中,我们对 Grok 大模型从技术溯源的角度,了解了它从 Transformer 架构局限性出发,迈向混合架构创新的历程,同时也梳理了从 Grok - 1 到 Grok - 3 的版本迭代所带来的技术跃迁以及其独特的差异化优势。这一期,我们将深入到 Grok 大模型的架构内部,探究其精妙…

2025第四届大学生算法挑战赛(进阶训练1) A-E 题解报告

前言 这是第四届大学生算法挑战赛的练习赛系列&#xff0c;这个比赛是国家一级协会的。 这章是进阶训练1的A-E题&#xff0c;感觉还是蛮基础的。 题解 第四届大学生算法挑战赛 进阶训练1 A. 小理养鱼 思路: 博弈 斐波那契数组 省流描述: 经典的羊狼博弈&#xff0c;即1只…

P8668 [蓝桥杯 2018 省 B] 螺旋折线

题目 思路 一眼找规律题&#xff0c;都 1 0 9 10^9 109说明枚举必然超时&#xff0c;找规律&#xff0c;每个点找好像没有什么规律&#xff0c;尝试找一下特殊点&#xff0c;比如&#xff1a;对角线上的点 4 16 36(右上角&#xff09; 4k^2&#xff0c;看在第几层&#xff08;…

Matlab 三容水箱系统故障诊断算法研究

1、内容简介 Matlab 190-三容水箱系统故障诊断算法研究 可以交流、咨询、答疑 2、内容说明 略 其次&#xff0c;对 DTS200 三容水箱系统进行机理建模&#xff0c;可分为对象建模和故障 建模&#xff0c;搭建了水箱系统的 SIMULINK 模型并建立了基于 Taylor 展开及 T-…

查看容器内的eth0网卡对应宿主机上的哪块网卡

查看容器内的eth0网卡对应宿主机上的哪块网卡 问题描述解决办法1. 进入容器,查看网卡的iflink(接口链路索引)值方法1:方法2: 2. 从宿主机过滤查询到的iflink(接口链路索引)值3. 确定veth接口连接的网桥方法2: brctl查看连接到网桥的接口--推荐 4. 查看网桥连接的物理网卡 问题描…

RT-DETR-R18版本的ultralytics的yaml更改分享!!

0.前言 起因&#xff1a; 本人深度学习&#xff0c;无奈组内没有好的显卡&#xff0c;只有我自己拥有的一张4060卡跑CV&#xff0c;稍微大一点的模型跑不了&#xff0c;我的模型主打一个轻量化... 在找模型与我的模型进行比较的时候&#xff0c;看的RT-DETR-R18版本(GFLPOS也…

AI低代码平台:开启高效智能开发新时代

科技飞速发展的当下&#xff0c;全球正加速迈向 AI 化。DeepSeek 等主流 AI 厂商的发展极大地改变了技术格局。众多企业为紧跟时代步伐&#xff0c;对高效开发工具的需求愈发迫切。百特搭AI低代码开发平台与 AI 技术的融合&#xff0c;为企业带来了开发高效化与智能化的全新解决…

苍穹外卖2

根据id查询员工 调用顺序&#xff1a;Controller—>Service—>ServiceImpl—>Mapper—>xml 1.controller层一个tab秒了&#xff08;ai生成&#xff09; 由于result泛型中希望返回一个employee对象&#xff0c;所以定义一个employee来接受Service的getbyid方法,在…

mac|使用scrcpy实现无线Android投屏

scrcpy是一个开源项目&#xff0c;从项目的releases可以得知它适用于windows、linux、mac github&#xff1a;https://github.com/Genymobile/scrcpy/releases github中提供了应用于mac系统的静态版本&#xff08;也就是上图的scrcpy-macos-aarch64-v3.1.tar.gz和scrcpy-macos…

【智驾中的大模型 -1】自动驾驶场景中的大模型

1. 前言 我们知道&#xff0c;大模型现在很火爆&#xff0c;尤其是 deepseek 风靡全球后&#xff0c;大模型毫无疑问成为为中国新质生产力的代表。百度创始人李彦宏也说&#xff1a;“2025 年可能会成为 AI 智能体爆发的元年”。 随着科技的飞速发展&#xff0c;大模型的影响…

网络4 OSI7层

OSI七层模型&#xff1a;数据如何传送&#xff0c;向下传送变成了什么样子 应用层 和用户打交道&#xff0c;向用户提供服务。 例如&#xff1a;web服务、http协议、FTP协议 1.用户接口 2.提供各种服务 通过浏览器&#xff08;接口&#xff09;提供Web服务 表示层 翻译 我的“…

文件IO6(开机动画的显示原理/触摸屏的原理与应用)

开机动画的显示原理 ⦁ 基本原理 一般电子产品在开机之后都会加深用户印象&#xff0c;一般开机之后都会播放一段开机动画&#xff08;视频、GIF…&#xff09;&#xff0c;不管哪种采用形式&#xff0c;内部原理都是相同&#xff0c;都是利用人类的眼睛的视觉暂留效应实现的…

低代码开发能否取代后端?深度剖析与展望-优雅草卓伊凡

低代码开发能否取代后端&#xff1f;深度剖析与展望-优雅草卓伊凡 在科技迅猛发展的当下&#xff0c;软件开发领域新思潮与新技术不断涌现&#xff0c;引发行业内外热烈探讨。近日&#xff0c;笔者收到这样一个颇具争议的问题&#xff1a;“低代码开发能取代后端吗&#xff1f…

反向代理断线重连优化

背景 1. 部分时候&#xff0c;反向代理因为路由重启&#xff0c;或者其他断网原因&#xff0c;等网络恢复后&#xff0c;无法对隧道重连。 2. 增加了心跳机制 在DEBUG调试过程中&#xff0c;发现禁用网卡后&#xff0c;在反向代理重连时候&#xff0c;服务器没有释放掉占用的…

array和list在sql中的foreach写法

在MyBatis中&#xff0c;<foreach>标签用于处理集合或数组类型的参数&#xff0c;以便在SQL语句中动态生成IN子句或其他需要遍历集合的场景。以下是array和list在SQL中的<foreach>写法总结。 <if test"taskIds ! null and taskIds.length > 0">…

SDP(一)

SDP(Session Description Protocol)会话描述协议相关参数 Session Description Protocol Version (v): 0 --说明&#xff1a;SDP当前版本号 Owner/Creator, Session Id (o): - 20045 20045 IN IP4 192.168.0.0 --说明&#xff1a;发起者/创建者 会话ID&#xff0c;那么该I…