描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
示例一:
输入:
"123.45e+6"
返回值:
true
示例二:
输入:
"1.2.3"
返回值:
false
题目简述
给定一个字符串判断它是否为表示数值。
算法一: 分治 (C++)
时间复杂度:O(N)
思路:
1. 对于数字来说:必须存在数字。
2. 对于 ' . ' 来说: (1) : 只能出现一次。
(2) : 不能在 e / E 的后面。
3. 对于e、E来说: (1) : 只能出现一次。
(2) : 前面一位 和 后面一位或者两位 必须是数字。
4. 对于 ' + ' 、' - ' 来说: 只能出现在 首位 或者 e/E的后面一位。
代码:
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param str string字符串 * @return bool布尔型 */ bool digit(char ch){ //判断是否是数字 if(ch>='0'&&ch<='9') return true; return false; } bool isNumeric(string str) { // write code here int exp=0;//是否出现过E、e int dot=0;//是否出现过 '.' int sym=0;//是否出现过 +、- int dig=0;//是否出现过数字 int len=str.size(); for(int i=0;i<len;i++){ if(str[i]=='.'){ if(dot||exp) return false; dot=1; } else if(str[i]=='e'||str[i]=='E'){ if(exp||!(digit(str[i-1])&&(digit(str[i+1])||digit(str[i+2])))) return false; exp=1; } else if(str[i]>='0'&&str[i]<='9'){ dig=1; continue; } else if(str[i]=='+'||str[i]=='-'){ if(i!=0&&!(str[i-1]=='e'||str[i-1]=='E')) return false; } else return false; } return dig; } };
算法二:
时间复杂度:O(N)
思路:
直接利用函数将字符串转化为数字,若是异常说明该字符串不能表示数字,则进行异常处理,返回false即可。
代码:
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param str string字符串 * @return bool布尔型 */ public boolean isNumeric (String str) { // write code here try{ Double res=Double.parseDouble(str); return true; }catch(Exception e){ return false; } } }