这道题是LeetCode里的第8道题。

题目要求:

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0。

说明:

假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [− − 1]。如果数值超过这个范围,qing返回  INT_MAX ( − 1) 或 INT_MIN (−) 。

示例 1:

输入: "42"
输出: 42

示例 2:

输入: "   -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
  我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。

示例 3:

输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。

示例 4:

输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
因此无法执行有效的转换。

示例 5:

输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。
  因此返回 INT_MIN (−) 。

虽然题目那么长,但是这道题却很简单,因为题目已经举了很多的例子来为我们说明来很多的情况。

首先第一点:先判断第一个字符是否为空格、数字或是正负号。若首字符不是上述字符的任意一种,则直接输出0。若为空格则一直遍历字符至正负号或数字为止,同时标记数字的正负,使用变量flag表示,若为正则flag=1,若为负则flag=0;

然后用res做中间变量保存结果(res=res*10+此时遍历的数字大小)。但这里需要注意一点:就是res的范围。题目要求的最终结果是在 [− − 1],其实题目不这样要求我们也得不到该范围外的数,因为int类型变量的范围就是 [− − 1]。遍历过程中也要注意字符是否为数字。

最后题目输出的重点还是在范围上,需要注意一点就是范围的两边是不对称的,最小值是−,最大值是 − 1。

 − 1=2147483647,也就是说如果res>214748364或者res=214748364而且当前字符大小>=7时,此时数字就达到最大值了,超出这个范围res就会造成溢出,数据出错, 此时直接输出最大值INT_MAX。但因为正负范围不同,所以正负号要分别考虑,比较麻烦的地方就在这里。

解题代码:

static const auto speedup=[]{
std::ios::sync_with_stdio(false);
std::cin.tie(NULL);
return 0;
}();
class Solution {
public:
int myAtoi(string str) {
int i,res=0,flag;
for(i=0;i<str.length();i++){
if(str[i]==' ')continue;
else if(str[i]>='0'&&str[i]<='9'){flag=1;break;}
else if(str[i]=='+'){i++;flag=1;break;}
else if(str[i]=='-'){i++;flag=0;break;}
else return 0;
}
if(str[i]<'0'||str[i]>'9')return 0;
for(;i<str.length();i++){
if(res>214748364||res==214748364&&str[i]>='7'){
if(res==214748364&&flag==0&&str[i]=='7')return -1*(res*10+str[i]-48);
res=INT_MAX;break;
}
res=res*10+str[i]-48;
if(i==str.length()-1||str[i+1]<'0'||str[i+1]>'9')break;
}
if(res==INT_MAX&&flag==0)return -1*res-1;
if(flag)return res;
return -1*res;
}
};

提交结果:

哦,对了。关于代码还有一点就是:代码前五行是我根据别人运行时间短的搬过来的。这样就能有效的缩短运行速度。在竞赛中,遇到大数据时,为文件的读写提供一种更为快速方法。这个代码就是禁用了cin的兼容特性。Click

个人总结:

这种题可以说没有难点,就是判断条件的分析,当然可以在运行时间上做功夫,提高运行速度。

【LeetCode】String to Integer (atoi)(字符串转换整数 (atoi))的更多相关文章

  1. LeetCode 8. 字符串转换整数 (atoi)(String to Integer (atoi))

    8. 字符串转换整数 (atoi) 8. String to Integer (atoi) 题目描述 LeetCode LeetCode8. String to Integer (atoi)中等 Ja ...

  2. 前端与算法 leetcode 8. 字符串转换整数 (atoi)

    目录 # 前端与算法 leetcode 8. 字符串转换整数 (atoi) 题目描述 概要 提示 解析 解法一:正则 解法二:api 解法二:手搓一个api 算法 传入测试用例的运行结果 执行结果 G ...

  3. 字符串转换整数 (atoi) C++实现 java实现 leetcode系列(八)

    字符串转换整数 (atoi) java实现 C++实现 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当 ...

  4. LeetCode Golang 8. 字符串转换整数 (atoi)

    8. 字符串转换整数 (atoi) 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组 ...

  5. 17、字符串转换整数 (atoi)

    17.字符串转换整数 (atoi) 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到的第一个非 ...

  6. 8. 字符串转换整数 (atoi)

    8. 字符串转换整数 (atoi) 方法一 import re import math class Solution(object): def myAtoi(self, str): "&qu ...

  7. 【LeetCode】8. String to Integer (atoi) 字符串转换整数

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:字符串转整数,atoi,题解,Leetcode, 力扣,P ...

  8. [LeetCode] 8. 字符串转换整数 (atoi)

    题目链接:https://leetcode-cn.com/problems/string-to-integer-atoi/ 题目描述: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先 ...

  9. Leetcode8.String to Integer (atoi)字符串转整数(atoi)

    实现 atoi,将字符串转为整数. 该函数首先根据需要丢弃任意多的空格字符,直到找到第一个非空格字符为止.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字 ...

随机推荐

  1. C++使用ADO连接数据库及其实例

    读写数据库的技术很多,现在多用ADO.ADO以COM方式提供,所以它的很多行为遵循COM规范.首先,要引入ADO的COM文件,它的位置一般在"C:/Program Files/Common ...

  2. 说说JVM原理?内存泄漏与溢出的区别?何时产生内存泄漏?

    1.JVM原理 JVM是Java Virtual Machine(Java虚拟机)的缩写,它是整个java实现跨平台的最核心的部分,所有的Java程序会首先被编译为.class的类文件,这种类文件可以 ...

  3. AJPFX关于单例设计模式

    单例设计模式优势:保证一个类在内存中的对象唯一性. 比如:多程序读取一个配置文件时,建议配置文件封装成对象.会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,就需要该配置文件对象在内存中 ...

  4. AJPFX分享java排序之希尔排序

    (1)基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每 ...

  5. JS核心

    JS核心 1.实例化对象 objectName = new objectType (param1 [,param2] ...[,paramN]) 参数  objectName 新对象实例的名称. ob ...

  6. 关于搭建系统直播和Thinkphp的杂谈(持续更新)

    Q:Access denied for user 'root'@'localhost' 错误 A:第一种:配置文件中把数据库的用户名密码再改一遍,把runtime里的文件删除  第二种:修改syste ...

  7. echarts getAttribute”的值: 对象为 null 或未定义 错误解决方法,

    echarts.js引用放在head中或者放在body中HTML代码的前面了,造成加载时阻塞后面的html. 解决方法就是将echarts.js的引用放在</body>之前就可以了,完美解 ...

  8. POJ 3133 Manhattan Wiring (插头DP,轮廓线,经典)

    题意:给一个n*m的矩阵,每个格子中有1个数,可能是0或2或3,出现2的格子数为2个,出现3的格子数为2个,要求将两个2相连,两个3相连,求不交叉的最短路(起终点只算0.5长,其他算1). 思路: 这 ...

  9. sourcegrid统计报表画法以及EXCEL导出内容代码完全版

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  10. 上下文 xx

    上下文,就是指在程序中的某个位置,可以访问到的所有资源的总和. 具体说来,在程序中资源可能是一个变量.一个常量.一个类的引用等等.