Day26-字符与数字转换_剑指Offer
表示数值的字符串
medium 原题连接:表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
若干空格一个 小数 或者 整数(可选)一个 'e' 或 'E' ,后面跟着一个 整数若干空格小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-')下述格式之一:至少一位数字,后面跟着一个点 '.'至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字一个点 '.' ,后面跟着至少一位数字整数(按顺序)
可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-')至少一位数字部分数值列举:["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非数值列举:["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
示例:
提示:
- 1 <= s.length <= 20
- s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,空格 ' ' 或者点 '.' 。
解题思路
一个包含全部可能的最大目标大致可以分为:
空格 正负 数字 小数点 数字 e/E 正负 数字 空格
从前到后依次划分部分进行检验:
- 删除前后空格
- 判断首字节是否为+-
- 依据E/e拆分为两个部分
- 前者判断是否由小数点,拆为两个部分
- 3中剩下的部分,4中的两个部分,检测是否为纯数字
注:允许4的前半部分为空
Java代码
把字符串转换成整数
medium 原题连接: 把字符串转换成整数
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
说明:
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−2^31, 2^31 − 1]。如果数值超过这个范围,请返回 INT_MAX (2^31 − 1) 或 INT_MIN (−2^31)
示例:
解题思路
和第一题有些类似,删除空格,判断符号,遇到字母就跳出
需要注意的是,如果第一个字符是符号,数字需要从下标为1的地方开始读,如果没有符号,则从0开始读
为了避免超过int类型的最大值,可以在循环中判断,是否即将超过最大值(因为每次记录结果是将ans= ans*10+new)
所以先判断是否依据超过了int最大值的十分之一(否则接下来进行*10运算会超过最大值)
又或者恰好为2147483648 2147483649,刚好超过一两位,所以在ans已经相等于int最大值的十分之一时判断最后一位的值是否大于7
