【剑指 Offer】20. 表示数值的字符串
【题目】
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
若干空格
一个 小数 或者 整数
(可选)一个 'e' 或 'E' ,后面跟着一个 整数
若干空格
小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-')
下述格式之一:
至少一位数字,后面跟着一个点 '.'
至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-')
至少一位数字
部分数值列举如下:
["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非数值列举如下:
["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
示例 1:
输入:s = "0"
输出:true
示例 2:
输入:s = "e"
输出:false
示例 3:
输入:s = "."
输出:false
示例 4:
输入:s = " .1 "
输出:true
提示:
1 <= s.length <= 20
s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,空格 ' ' 或者点 '.' 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof
【思路】
先判空,如为空不能表示数值
设置标志位 标记数字,小数点和e
删除字符串首位的空格,然后将其转换为字符数组
遍历
判断是否为数字,是的话标记数字为true
是否是小数点 小数点前不能为小数点,小数点前也不能为e ,都满足 标记小数点为true
是否是e 如果是,前面必须是数字,且不能为e,满足标记e为true 然后标记数字为false
是否是符号位 如果是,必须是在首位或e位后,否则不满足
【代码】
class Solution { public boolean isNumber(String s) { //先判空,如为空不能表示数值 //设置标志位 标记数字,小数点和e // 删除字符串首位的空格,然后将其转换为字符数组 // 遍历 // 判断是否为数字,是的话标记数字为true // 是否是小数点 小数点前不能为小数点,小数点前也不能为e ,都满足 标记小数点为true // 是否是e 如果是,前面必须是数字,且不能为e,满足标记e为true 然后标记数字为false // 是否是符号位 如果是,必须是在首位或e位后,否则不满足 if(s.length()==0) return false; boolean num_flag = false; boolean dot_flag = false; boolean e_flag = false; char[] num = s.trim().toCharArray(); for(int i=0;i<num.length;i++){ if(num[i]>='0'&&num[i]<='9'){ num_flag = true; }else if(num[i]=='.'){ if(dot_flag!=true&&e_flag!=true){ dot_flag = true; }else{ return false; } }else if(num[i]=='e'||num[i]=='E'){ if(!e_flag&&num_flag){ e_flag = true; num_flag= false; }else{ return false; } }else if(num[i]=='+'|| num[i]=='-'){ if(i!=0&&num[i-1]!='e'&&num[i-1]!='E'){ return false; } }else{ return false; } } // 最后一定是数字或小数点 不是的话也是错的 return num_flag; } }

浙公网安备 33010602011771号