【practise】string_atoi

news2024/11/14 22:36:11

今天来分享一道比较平常的练习题,说实话我自己写了半天,自己写的很烂最后还是看的答案…

1.题目概要

题目链接:LINK
在这里插入图片描述

2.题目难点

这个题目有两个难点,如下:

  • 拿到了全部都是数字字符的字符串,怎么将这个字符串转变成整数。
    对于这个问题,主要是字符转整形的问题。
  • 如何有效的判定该整数越界?
    对于这个问题,就有点难办了,如果说我们用一个INT_MAX去比较,怎么可能会比的出来,说白了就是int不能表示出比INT_MAX大的整数来。

3.难点解析

对于数字字符串转整数的问题,主要是ASCII码与数字转换的问题。

对于一个是数字字符串,我们可以用下面方法进行转换:
在这里插入图片描述

for(int i = 0; i < str.length(); i++)
{
	res = 10 * res + str[i] - '0';
}

对于字符串转整形是否溢出的问题,我现在知道两种方法。
第一种,用long long类型去替代int类型,这样去拿着INT_MAX值去比较就行了,因为longlong完全可以表示比INT_MAX大的数字了。
第二种,就是用一个比INT_MAX小10倍(并不是固定的)的值去标记,如果比这个标记值大了,那么意味着下一次相加大概率会溢出。
在这里插入图片描述
在这里插入图片描述

4.代码呈现

class Solution {
public:
    int myAtoi(string str) {
        int res = 0, bundry = INT_MAX / 10;
        int length = str.size(), i = 0, signal = 1;

        // 1.空字符串直接返回0
        if(length == 0) return 0;
        // 2.跳过前导空格
        while(str[i] == ' ') i++;
        if(i == length) return 0; // 一个字符串全是前导空格,也返回空
        // 3.尝试读符号
        if(str[i] == '-') signal = -1;
        if(str[i] == '-' || str[i] == '+') i++;
        // 4.开始解析字符串
        for(int j = i; j < length; j++)
        {
            if(!isdigit(str[j])) break;// 读到非数字,直接break
            if(res > bundry || res == bundry && str[j] > '7') return res = signal == 1 ? INT_MAX : INT_MIN; // 处理溢出问题
            
            res = 10 * res + (str[j] - '0');
        }

        // 5.正常返回
        return signal * res;
    }
};

下面是每一步详细的想法:

#define _CRT_SECURE_NO_WARNINGS 1
#include<string>
using namespace std;

class Solution {
public:
    int myAtoi(string str) {
        int res = 0, // 储存结果的变量
            bndry = INT_MAX / 10; // 边界标志,该最大值是2^31-1,边界值是(2^31-1) / 10
        int i = 0,
            sign = 1, // 符号位
            length = str.size(); //字符长度

        if (length == 0) return 0; //特殊情况:空字符串,直接返回0
        while (str[i] == ' ') //跳过空格
            if (++i == length) return 0; //整个字符串都为空格,返回0

        if (str[i] == '-') sign = -1; //读到负号,把符号位置为-1
        if (str[i] == '-' || str[i] == '+') i++; // i读到符号位后向后走一个

        for (int j = i; j < length; j++) {
            if (str[j] < '0' || str[j] > '9') break; //读到非数字字符,直接break

            if (res > bndry || res == bndry && str[j] > '7') // 越界情况
                return sign == 1 ? INT_MAX : INT_MIN;

            res = res * 10 + (str[j] - '0'); // 正常拼接
            // res初始值是0,第一次0*10还等于0再加上数值刚好。
        }

        return sign * res; // 正常返回
    }
};

注:本文部分内容引用自力扣,链接


EOF

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

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

相关文章

新160个crackme - 019-Acid Bytes.3

运行分析 需要破解Name和Serial PE分析 upx壳 linux系统&#xff1a;upx -d CrackMe3.exe 脱壳发现是Delphi系统&#xff0c;32位 静态分析&动态调试 找到关键字符串&#xff0c;进入关键函数 静态分析&#xff0c;发现了Name和Serial明文 验证成功

深入理解 Git `git add -p` 命令中的交互选项

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

2 路模拟量转 Lora模块(开关量,0-10V,4-20ma)

一、功能概述 本产品是一款无线中继器&#xff0c;将 0~ 10V 电压信号转为无线信号&#xff0c; 通过无线方式远传&#xff0c;实现远程通信功能。采用 Lora 无线通信技术&#xff0c; 工作中心频率 433M&#xff0c;空旷传输距离 7000 米。点对点电流远传&#xff0c;用无 线…

智慧工厂数字孪生解决方案

项目背景 随着工业自动化和智能化的不断深入&#xff0c;智慧工厂正成为制造业的新标杆。数字孪生技术作为智慧工厂的核心&#xff0c;通过物理模型、传感器更新、运行历史等数据的集成&#xff0c;实现对现实世界的映射&#xff0c;反映实体装备的全生命周期过程。 方案简介 …

Nacos在Docker上单机模式部署

文章目录 前言一、Nacos二、单机Docker部署 前言 Nacos是阿里巴巴开源的一款用于动态服务发现、配置管理和服务管理的平台。它是“Dynamic Naming and Configuration Service”的缩写&#xff0c;旨在帮助用户实现微服务架构中的服务注册与发现、配置管理、动态DNS服务等功能。…

【一文了解大数据及数据要素,浅说隐私计算、联邦学习】

大数据 不等于 数据要素 大数据&#xff1a;大数据指的是体量巨大、增长迅速且结构复杂的数据集合。传统的数据处理工具无法有效存储和分析这些数据。大数据的处理涉及新的技术和方法&#xff0c;以提取有用的信息和知识。 数据作为新型生产要素&#xff0c;是数字化、网络化、…

C语言bsearch函数

目录 开头1.什么是bsearch函数2.bsearch函数的第五个参数的写法3.bsearch函数的实际运用有序数组查询有序字符串查询有序二维字符串数组查询 结尾 开头 大家好&#xff0c;我叫这是我58。今天&#xff0c;我们来学一下关于C语言里的bsearch函数的一些知识。 1.什么是bsearch函…

Ubuntu系统中下载安装Checkmk,搭建网络监控系统

文章目录 checkmk是什么&#xff1f;下载安装checkmkUbuntu系统安装选择checkmk版本下载checkmk安装checkmk检查checkmk版本创建checkmk站点启动checkmk及站点 推荐阅读 checkmk是什么&#xff1f; Checkmk 是一款开源的、可扩展的、企业级的网络监控工具。Checkmk提供了丰富的…

unity2D游戏开发14漫游

漫游算法 让敌人在地图上漫游,发现玩家在附加,就会追击,直到玩家逃跑或者杀死玩家 将Enemy预购件拖进场景,并将实例EnemyObject添加CircleCollider2D,选中Is Trigger复选框 创建漫游脚本 选中EnemyObject,点击Animation,右击enemy-idle-1,选择Set as Layer Default St…

发现编程新乐趣,20个Python小游戏源码宝藏,快来挖掘属于你的惊喜!(附源码)

经常听到有朋友说&#xff0c;学习编程是一件非常枯燥无味的事情。其实&#xff0c;大家有没有认真想过&#xff0c;可能是我们的学习方法不对&#xff1f; 比方说&#xff0c;你有没有想过&#xff0c;可以通过打游戏来学编程&#xff1f; 今天我想跟大家分享几个Python小游…

Node.js(5)——包

包 包的概念&#xff1a;将模块&#xff0c;代码&#xff0c;其他资料聚合成一个文件夹 分类&#xff1a; 项目包&#xff1a;主要用于编写项目和业务逻辑 软件包&#xff1a;封装根据和方法进行使用 要求&#xff1a;根目录中&#xff0c;必须有package.json文件&#xff08…

美林数据Tempo Talents | 两大资源中心,打造开放、成长型数智人才能力平台

在数字化时代的大潮中&#xff0c;高校作为知识与人才培养的重要阵地&#xff0c;独立分散的课程资源管理方式已无法满足现代教育的需求&#xff0c;而数据资源的分散和碎片化也阻碍了科研和教学工作的深入进行。那么&#xff0c;高校如何打造一个集中、高效的课程与数据资源中…

C#/Winform入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享

场景 作为一名C#的Winform开发者&#xff0c;势必经历过从入门到自学、从基础到进阶、从学习到强化的过程。 当经历过几年企业级开发的磨炼&#xff0c;再回头看之前的开发过程、成长阶段发现确实是走了好多的弯路。 作为一名终身学习的信奉者&#xff0c;秉承Java体系需持续…

安卓手机数据恢复技巧之5个方法指南, 帮你吃上一次后悔药!

倘若您不慎于 Android 设备里删掉了宝贵的照片、视频以及文件&#xff0c;其后果恐怕难以承受。不过无需忧虑&#xff01;您能够在这篇极具价值的文章中探寻 5 款免费的 Android 数据恢复软件与应用程序。我们会阐述每一种工具最为令人称奇的功能以及其优劣势所在。在读完这篇全…

CSS学习 01 利用鼠标悬停制造文本隐藏效果

效果&#xff1a; 在正常状态下&#xff0c;剧透内容的背景色和文本颜色都是黑色&#xff0c;导致剧透内容看起来是隐藏的&#xff08;黑色文本在黑色背景上不可见&#xff09;。当鼠标悬停在剧透内容上时&#xff0c;背景色和文本颜色恢复为初始值&#xff0c;使得剧透内容可…

react-native 从入门到实战系列教程一底部导航及页面切换

react-native 里面的导航有点繁琐&#xff0c;需要引入 react-navigation 这个库。也是官网推荐的。整个过程不难&#xff0c;就是配置比较繁琐&#xff0c;还会因为网络的原因&#xff0c;时常报错&#xff0c;需要多试几次。排查错误&#xff0c;需要多看文档。安装完依赖&am…

Java同城信息付费系统对接微信广告系统小程序源码

解锁同城新商机&#xff01;同城信息付费系统如何高效对接微信广告 &#x1f680; 引言&#xff1a;同城信息付费的新纪元 在这个信息爆炸的时代&#xff0c;同城信息服务平台如雨后春笋般涌现&#xff0c;为用户提供了便捷的生活服务入口。然而&#xff0c;如何在众多平台中…

8月1日SpringBoot学习笔记

今天内容:配置maven 搭建springboot项目 约定大于配置 IOC DI 常用注解 springbean的作用域 springbean的生命周期 Springboot 创建springboot项目 maven项目添加springboot变成的springboot项目 具体步骤参考&#xff1a;http://t.csdnimg.cn/2NTuK与http://t.…

matlab y=sin(x) - 2/π*(x)函数绘制

[TOC](matlab ysin(x) - 2/π*(x)函数绘制) ysin(x) - 2/π*(x) clc; clear; close all; x_axis_length 10; y_axis_length 10; % 创建 x 值向量 x_positive linspace(0.1, 10, 1000); % 正半轴上的 x 值 x_negative linspace(-10, -0.1, 1000); % 负半轴上的 x 值% 计算…

从数学角度理解SVM分类算法

再谈间隔最大化 我们知道&#xff0c;支持向量机是以“间隔”作为损失函数的&#xff0c;支持向量机的学习过程就是使得间隔最大化的过程&#xff0c;若想要了解支持向量机的运转机制&#xff0c;首先就得知道间隔怎么计算。 “间隔大小”是由距离分类“界限”最近的两个数据点…