Leetcode--8

LeetCode UTF_8编码验证 UTF-8 中的一个字符可能的长度为 1 到 4 字节,遵循以下的规则: 对于 1 字节的字符,字节的第一位设为0,后面7位为这个符号的unicode码。 对于 n 字节的字符 (n > 1),第一个字节的前 n 位都设为1,第 n+1 位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。 这是 UTF-8 编码的工作方式: Char. ... 阅读详情

原题链接:https://leetcode.com/problems/string-to-integer-atoi/#/description

题目:

Implement atoi to convert a string to an integer.

Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.

Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.

Update (2015-02-10):
The signature of the C++ function had been updated. If you still see your function signature accepts a const char * argument, please click the reload button  to reset your code definition.

spoilers alert... click to show requirements for atoi.

Requirements for atoi:

The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial plus or minus sign followed by as many numerical digits as possible, and interprets them as a numerical value.

The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.

If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed.

If no valid conversion could be performed, a zero value is returned. If the correct value is out of the range of representable values, INT_MAX (2147483647) or INT_MIN (-2147483648) is returned.

题目说明:

实现一个函数,将字符串转换成数字,例如将"123"转换成123。由于输入字符串形式并未指定,所以需要考虑以下五种情况:

1.从第一个非空字符串开始处理。如s=" __123" (_代表空格键)则应该从第三个字符开始处理。

2.要处理字符串前面的“”“”

3.字符串中可能含有非'0'~'9'的字符,遇到这样的字符,该字符后面的字符失效,例如:s="12a3" 应转换为 12.

4.若该字符串中全是空格,则函数不进行任何转换。

5.越界情况,当转换后数字超高int 的最大值或最小值时,返回int型的最大值或最小值 INT_MAX (2147483647) or INT_MIN (-2147483648) 


class Solution {
public:
    int myAtoi(string str) {
        
        //if(str.size()<=0) return;
        int i=0;
        int sign=1;
        long long result=0;
        for(;i<str.size();i++){
            if(str[i]==' '){
                continue;
            }
            else
                break;
        }
        
        //if(i==str.size()-1) return;
        if(str[i]=='+'||str[i]=='-'){
            sign=(str[i++]=='-')?-1:1;
        }
        
        while(str[i]>='0'&&str[i]<='9'&&i<str.size()){
            result=result*10+(str[i++]-'0');
            if(sign*result>=INT_MAX) return INT_MAX;
            if(sign*result<=INT_MIN) return INT_MIN;
        }
        
        
        return sign*result;
    
        
    }
};

处理空格比较简单,第一个for循环可以找到第一个非空格的字符。由于涉及到'+'和'-',所以设置sign符号位,用来表示第一个非空格字符是'+'还是'-'.

在wihle循环的执行条件是字符必须在'0'~'9'之间,且下标没有超出字符串长度,在循环体中,将字符转换成数字。并通过语句

if(sign*result>=INT_MAX) return INT_MAX;
if(sign*result<=INT_MIN) return INT_MIN;
判断是否越界。注意此处的result为long long 类型,其可以表示比INT_MAX大或比INT_MIN小的数字。


另外,看到一段很巧妙的判断是否越界的代码:

int atoi(const char *str) {
    int sign = 1, base = 0, i = 0;
    while (str[i] == ' ') { i++; }
    if (str[i] == '-' || str[i] == '+') {
        sign = 1 - 2 * (str[i++] == '-'); 
    }
    while (str[i] >= '0' && str[i] <= '9') {
        if (base >  INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) {
            if (sign == 1) return INT_MAX;
            else return INT_MIN;
        }
        base  = 10 * base + (str[i++] - '0');
    }
    return base * sign;
}
该段程序通过语句
base >  INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7

判断base是否越界,经典的是str[i]-'0'>7;这是因为INT_MAX最大为 2147483647,INT_MAX/10=214748364,最后的个位数字是7.所以只要str[i]-'0'>7那么base肯定就是越界了。。。。

补充知识点:

1.关于INT_MAX与INT_MIN(https://www.quora.com/What-is-INT_MIN-and-INT_MAX-in-C++)

INT_MIN is a macro that expands to the smallest (most negative) value that can be stored in a variable of type int.

INT_MAX is a macro that expands to the largest (most positive) value that can be stored in an int.

On most processors INT_MIN == -INT_MAX - 1, i.e., there is one more negative number than positive number in the range of legal values.

For unsigned int, the corresponding values are 0 and UINT_MAX. Typically UINT_MAX == 2*INT_MAX+1.




【中等】力扣算法题解析LeetCode8:字符串转换整数(atio) 本文实现了一个将字符串转换为32位有符号整数的函数myAtoi。算法步骤包括:跳过前导空格、处理符号位、读取数字字符并进行累积计算,同时处理溢出情况。关键点在于使用负数累积避免正数溢出,并在每次计算前检查是否超出32位整数范围。对于溢出情况,返回相应的最大值或最小值。该方法时间复杂度为O(n),空间复杂度为O(1),能高效处理各种边界条件。 阅读详情

相关推荐

【力扣LeetCode】java算法刷题大全第8题之环形链表

一、给定一个链表,判断链表中是否有环 /** * 当存在环形的条件下,快慢指针形成了一个龟兔赛跑的模型,如果两个指针指向了 * 同一个元素,说明存在环形,返回true * 解法一:快慢双指针 * * @param head * @return */ public boolean hasCycle(ListNode head) { if (head == null) return false;

小米吃辣椒的博客 1938

7. 整数反转

解法一:对输入数字进行整除和取余运算,并把输出值乘以10后与每次取余的结果相加,直到原数据变为0 每次循环,原数对10取余+结果乘以10,同时原数对10整除。 时间复杂度:O(log(x)),x 中大约有 log10​(x)位数字。 空间复杂度:O(1)。 C++: int reverse(int x) { int rev = 0; while (x != 0) { ...

sinat_33725641的博客 161

解决mmdet3d安装中因PyTorch高版本引发的THC.h缺失问题

本文详细分析了在安装mmdet3d时,因PyTorch版本过高导致THC.h头文件缺失的常见报错问题。文章指出该错误的本质是PyTorch 1.7+版本废弃了旧API,与老版本C++扩展代码不兼容。提供了两种核心解决方案:一是降级PyTorch至1.6及以下版本;二是修改源码,将THC.h引用替换为ATen/cuda等新头文件,并给出了具体的代码修改示例和排查技巧。

weixin_29085151的博客 380

C++中INT_MAX / INT_MIN

INT_MAX和INT_MIN INT_MAX = 231 -1 = 2147483647,INT_MIN= - 231 = -2147483648 整数操作时int是32时很容易出现越界的情况,操作时需要考虑越界 常与INT_MAX/10或者INT_MAX/10 + 7比较 其中 +7 是因为231 -1 = 2147483647的最后一位是7 ...

qq_45809066的博客 1292

PointNet/PointNet++模型调参实战:如何用PyTorch让你的点云分割精度再涨5个点?

本文深入探讨了PointNet/PointNet++模型在点云分割中的调参技巧,通过PyTorch实现精度提升5个点的实战方法。重点分析了点云密度自适应策略、感受野与细节保留的平衡,以及训练加速与稳定性技巧,适用于电力巡检、自动驾驶等场景的激光点云数据处理。

weixin_30836759的博客 477

HAL库硬件SPI驱动ST7735 TFT屏幕:从零实现高效刷屏与图形绘制

本文详细介绍了如何使用STM32的HAL库硬件SPI驱动ST7735 TFT屏幕,从硬件连接到SPI配置优化,再到图形绘制与文本显示的实现。重点分享了DMA传输、局部刷新等高级优化技巧,显著提升刷屏效率,帮助开发者快速掌握屏幕驱动技术并应用于实际项目。

pink的博客 741

力扣整数反转讲解

runtime error: signed integer overflow: 964632435 * 10 cannot be represented in type 'int' [solution.c]表示溢出的问题,然后我们就需要对这个进行判断,还有,在这种题里面就不要用printf要用返回值。这个是用时相对较短的,但是定义了一个temp变量进行辅助,当然不去定义也同样没有问题的。整体来说,并没有什么难度,入门的程度就可以做到的,但是不注意会出现。中的数字部分反转后的结果。,则表示反转后的数会溢出。

m0_74802467的博客 279

Windows 11安装 SQLServer 2008 R2 失败问题处理

Windows 11安装SQL Server 2008 R2失败解决方案 由于Windows 11移除了对PowerShell 2.0的支持,导致SQL Server 2008 R2安装失败。经过多次尝试,最终通过**方案六(修改注册表模拟PowerShell 2.0环境)**成功安装。其他可行方案包括: 使用SP3集成版安装包 通过命令行跳过检查(/SUPPRESSPOWERShellCHECK参数) 创建特殊配置文件 替代方案建议: 使用Docker容器运行 在虚拟机中安装 升级到新版SQL Serve

oDengWei的博客 7176

整数反转-leetcode

题目:将一个32位的有符号整数x的数字部分进行反转,输出反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。要求不允许存储 64 位整数(有符号或无符号)。 eg: 输入:x = 12345 输出:54321 分析: 用循环取模的方法来进行反转,n = n*10 + x%10 , x = x/10 ; (n为反转后得到的数字) 进行反转不难,本题的难点是要判断反转后得到的整数 n 是否超过了有符号整数的范围。...

Debbydou的博客 435

【卫星语音通信】神经网络语音编解码算法:AudioDec

最新研究表明,通过深度学习模型对语音信号进行智能压缩与重建,可在12 kbps码率下实现48 kHz采样率的高保真语音还原,其主观音质评分(MOS)可达3.9分(满分4.27分),远超传统参数编码技术。这意味着未来卫星电话的通话质量有望达到CD级水准,而蜂窝网络的语音业务带宽需求可降低60%以上,为蜂窝和卫星网络中的大规模物联网语音交互铺平道路。它的诞生为神经音频编解码技术带来了一次重要升级,有助于让未来实时语音交互更流畅、更清晰,也让我们进一步体验到人工智能与音频信号处理结合所带来的创新可能性。

u011376987的博客 1473

2026年医疗AI的可信革命全栈实现(上)

医疗AI可信化:贝叶斯网络与向量数据库的协同架构 本文探讨2026年医疗AI发展的关键转折点——从追求生成能力转向构建可信决策系统。核心观点认为,医疗AI下一阶段的竞争焦点在于不确定性量化和错误传播约束,而非单纯的问答流畅度。研究提出以Python为开发语言、结合向量数据库与贝叶斯网络的混合架构: 技术分层 语言层(LLM):处理自然语言交互与工具调用 证据层(Milvus/Qdrant):实现可审计的临床知识检索 概率层(pgmpy/PyMC):执行贝叶斯推理与风险路由 治理层:确保权限控制与人工复核机制

AllenLV的博客 1151

【每日力扣17】字符串转换整数 (atoi)

一、题目[LeetCode-8] 请你来实现一个myAtoi(string s)函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。 函数myAtoi(string s) 的算法如下: 读入字符串并丢弃无用的前导空格 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。 将前...

micah_yaokunkun的博客 1029

YOLOv8架构革命:通过EfficientViT融合实现精度-速度的帕累托突破

目标检测领域长期存在精度与速度的权衡难题。视觉Transformer(ViT)的引入解决了长距离依赖问题,但其巨大的计算复杂度制约了实时应用。最新研究表明,将轻量级ViT与YOLO架构融合,可在几乎不损失推理速度的前提下,将mAP提升3-8个百分点。这种架构改进方案已在工业检测、自动驾驶、安防监控等多个领域得到验证,在保持实时性的同时显著提升了复杂场景下的检测可靠性。通过模块化设计,可以灵活适配不同规模的YOLOv8模型,为实际应用提供精度-速度的帕累托最优解。

FJN110的博客 148

力扣LeetCode第8题字符串转换整数

力扣LeetCode第8题字符串转换整数

weixin_44061444的博客 231

【读代码】深入解析Ragas:RAG应用效果评估最好的工具

Ragas是由Exploding Gradients团队开发的专业LLM应用评估框架,通过自动化测试和量化指标帮助开发者构建可靠的AI系统。# 典型架构模块 ├── metrics # 50+评估指标实现 ├── testset # 测试集生成系统 ├── embeddings # 多模态嵌入支持 ├── integrations # 主流框架集成 ├── optimizers # 遗传算法优化器 └── experimental # 前沿功能实验区。

kakaZhui的博客 850

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【中等】力扣算法题解析LeetCode393:UTF-8 编码验证

LeetCode 393题要求验证整数数组是否为有效的UTF-8编码序列。UTF-8编码规则包括:1字节字符(首字节0开头)、2-4字节字符(首字节前缀为110/1110/11110,后续字节前缀为10)。算法通过遍历数组,检查首字节确定字符长度,并验证后续字节格式。关键点包括:处理非法起始字节(如10开头或超过4字节)、确保字符完整性(无截断)、单次遍历实现O(n)时间复杂度和O(1)空间复杂度。代码通过位运算高效判断字节前缀,并严格处理边界条件,如空数组、单字节截断等。最终返回布尔值表示序列有效

ylumwd的博客 796

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

力扣第8题题解

舍入:如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被舍入为 −231 ,大于 231 − 1 的整数应该被舍入为 231 − 1。请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。符号:检查下一个字符(假设还未到字符末尾)为 ‘-’ 还是 ‘+’。转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。返回整数作为最终结果。

2401_89110480的博客 177

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

力扣LeetCode刷题8 机器人大冒险

力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0)。小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动。指令有两种: U: 向y轴正方向移动一格 R: 向x轴正方向移动一格。 不幸的是,在 xy 平面上还有一些障碍物,他们的坐标用obstacles表示。机器人一旦碰到障碍物就会被损毁。 给定终点坐标(x, y),返回机器人能否完好地到达终点。如果能,...

qq_33891314的博客 551

力扣(LeetCode)刷题,简单题(第8期)

力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升。

不脱发的程序猿 3840

力扣刷题日常(7-8)

本文介绍了力扣第7题"整数反转"的解题思路,重点讨论了如何处理整数溢出的关键问题。通过数学方法逐位取余和除法运算实现数字反转,并在构建新数字前预先检查是否超出32位有符号整数范围[-2^31,2^31-1]。文章详细解释了正负数的溢出判断条件,强调在C#等语言中整数溢出不会自动报错的特性,需要采用防御性编程策略提前预判。该解法时间复杂度为O(log10(n)),空间复杂度O(1),适用于处理32位整数反转问题。

NFA晨曦的个人博客 2718

力扣318. 8. 字符串转换整数

第一百零一天 --- 力扣318. 8. 字符串转换整数题目一思路细节代码 题目一 力扣:8. 字符串转换整数 (atoi) 思路 直接按照题意模拟就行 细节 这个题不难,就是有一堆细节 1、两个边界处要用long long 才稳妥,直接给值,否则会被认定为int 代码 class Solution { public: int myAtoi(string s) { long long num1 = 2147483647;//正数边界,直接给值,不要计算,计算出来的默认是int long

qq_45678698的博客 304

力扣8. 旋转字符串(字符串用法)

力扣8. 旋转字符串 https://www.lintcode.com/problem/rotate-string/description 给定一个字符串(以字符数组的形式给出)和一个偏移量,根据偏移量原地旋转字符串(从左向右旋转)。 思路:偏移几位等于循环次数;完成交换过程,每循环一次偏移一个 #include "stdafx.h" #include <string&...

小麦China的博客 422

力扣LeetCode算法打卡学习第8天

三、字符串中的第一个唯一字符 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。 1、我的——用哈希表统计 class Solution { public int firstUniqChar(String s) { Map<String, Integer> hashtable = new HashMap<String, Integer>(); //用哈希表统计字符串出现次数 for (int

Shadownow的博客 300

leetcode8

leetcode8地址 int myAtoi(char* str) { long re = 0; bool flag = false; if(str[0]=='\0') return 0; for(int i=0;str[i]!='\0';i++) if(str[i]>='0' && str[i]<='9')

Doubter_的博客 408

day3_leetcode8

Leetcode第8题: 1. 题目:   2.解法一 题目解析:就是从一个字符串的首个非空字符开始匹配,即从一个字符串s的首个非空字符开始向后连续匹配,如果得到的这个新的字符串可以用int()方法转化为数字(例如,string = “-4839”, “+38420”, “977428”,这些字符串都是可以直接转换为数字的,但是例如”-839j”, “98j38”等穿插...

乙壳虫的博客 2533
上一篇: 苹果笔记本设置MAC地址和ip地址
下一篇: 数据结构的堆栈与内存中堆栈的区别
Ddreaming
博客等级 码龄10年 122粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值