Leetcode 08 String to Integer (atoi)(实现c++atoi即字符串转数字的功能)

2024-05-13 20:58

本文主要是介绍Leetcode 08 String to Integer (atoi)(实现c++atoi即字符串转数字的功能),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

08 字符串转数字

看似非常简单的题目,但是实际操作起来真的非常困难。作为一道中等难度的题目,其通过率仅仅只有14%多,在leetcode 上通过率是第二低的一道题目。题目本身给出的信息就很少,只是实现atoi就行,然而atoi的规则和要求其实也需要有一定的了解,下面一大段就是用来描述atoi的功能需求,因为note之前说了如果希望提升难度就直接编写代码,程序如下:
int myAtoi(string str) {long result = 0;int indicator = 1;for(int i = 0; i<str.size();){i = str.find_first_not_of(' ');if(str[i] == '-' || str[i] == '+')indicator = (str[i++] == '-')? -1 : 1;while('0'<= str[i] && str[i] <= '9') {result = result*10 + (str[i++]-'0');if(result*indicator >= INT_MAX) return INT_MAX;if(result*indicator <= INT_MIN) return INT_MIN;                }return result*indicator;}
}

总体来说考虑到了一些情况比如超过最大值最小值或者正负号等常规情况,但对于特殊情况就出现了问题。比如下图:
对于相连的两个符号的解应该返回是0,而这里返回的确是-2,即没有实现需求,所以通过增加一个变量flag来判断符号的次数,如果符号大于2时返回0,程序如下:
int indicator = 1;for(int i = 0; i<str.size();){i = str.find_first_not_of(' ');if(str[i] == '-' || str[i] == '+')indicator = (str[i++] == '-')? -1 : 1;//更改为如下程序int indicator = 1,flag=0;for(int i = 0; i<str.size();){i=str.find_first_not_of(' ');if(str[i] == '-' || str[i] == '+'){indicator = (str[i++] == '-')? -1 : 1;flag++;}if(flag>1)return 0;

如此就解决了正负符号过多的问题,但随后出现问题为当字符串之中出现字母的时候,该题目报错为:
即要求无视后面字符以及之后的数字输出字母前面的数字,在将循环条件更改为:
 while('0'<= str[i] && str[i] <= '9')//改为while(isdigit(str[i])
能够实现跳过所有字母将数字输出,但依旧没有达到目的,于是在while之后增加判断条件:
 if(result!=0 && !isdigit(str[i]))return result*indicator;
实现了能够跳过字符输出全部的数字的目的,但依旧不是结果,将判断条件改为:
if(!isdigit(str[i])&&isdigit(str[i-1]))return result*indicator;
从而达到能够输出截断字符串的目的,然而问题还是存在,并不能够AC,题目情况太多,很多情况考虑之后会引发其他的一些问题,甚至感觉有些要求很是矛盾,如下案例在该式中依旧无法通过,是对字符串头部的判断,要求在符号之后不能有非数字的元素存在,所以在我的程序中,为直接跳过符号后的字符进行判断数字所以出现了如下错误:
所以在源程序基础上再添加东西,即判断这方面的情况,具体判断再符号判断的时候进行,所以最后AC的代码如下:
class Solution {
public:int myAtoi(string str) {long result = 0;if(str.empty())return 0;int indicator = 1,flag=0;int i=str.find_first_not_of(' ');for(; i<str.size();i++){if(!isdigit(str[i])&&str[i] != '-' && str[i] != '+')return 0;if(str[i] == '-' || str[i] == '+'){indicator = (str[i] == '-')? -1 : 1;flag++;if(!isdigit(str[i+1]))return 0;}if(flag>1)return 0;while(isdigit(str[i])) {result = result*10 + (str[i++]-'0');if(result*indicator >= INT_MAX) return INT_MAX;if(result*indicator <= INT_MIN) return INT_MIN;                }if(!isdigit(str[i])&&isdigit(str[i-1]))return result*indicator;}return result*indicator;}
};
整个程序调的我是生活不能自理,改一点错一点,改回去再换方案,不停的找可能能够增加通过率的判断条件。当然最后的时候对前面的题意要求也有读过,毕竟在不知道到底什么要求的情况下调这个程序真的是太蛋疼了,当然风雨之后必然有彩虹,程序AC之后感觉世界都亮了。不过现在想想还是有些脑壳发痛,刷题不易,且刷且珍惜啊!当然也有比该解法看起来方便和简练,快的程序,然而之前看了看感觉并不是很好懂。所以希望各位喜欢这个AC的程序!


这篇关于Leetcode 08 String to Integer (atoi)(实现c++atoi即字符串转数字的功能)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/986809

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定