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

相关文章

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert