题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
代码实现:
抄袭剑指offer,主要在于2个封装函数,否则会比较麻烦。
jumpoverchar----跳过正负号
scanUnsignedint----跳过数字
注意:
对指针进行运算。
- 二维指针
- 引用
class Solution {
public:
bool scanUnsignedint(char* & str)
{
char* tmp=str;
while(*str!='\0'&&*str>='0'&&*str<='9')
++str;
return str>tmp;//只要有数字就行,用指针地址来判断
}
bool jumpoverchar(char*& str)
{
if(*str=='+'||*str=='-')
str++;
return scanUnsignedint(str);
}
bool isNumeric(char* string)
{
//小数
//科学计数法(底数,指数都可能有正负号,e大小写)
//正负号
if(string == NULL)
return false;
bool numer=jumpoverchar(string);
if(*string=='.')
{
++string;
/*.123 2333. 233.2131
所以用||,3种情况*/
numer=scanUnsignedint(string)||numer;
}
if(*string=='e'||*string=='E')
{
++string;
numer=numer&&jumpoverchar(string);
}
return numer&&*string=='\0';
}
};
调试代码:
#include <iostream>
using namespace std;
bool scanUnsignedint(char* & str)
{
char* tmp=str;
while(*str!='\0'&&*str>='0'&&*str<='9')
++str;
return str>tmp;//只要有数字就行,用指针地址来判断
}
bool jumpoverchar(char*& str)
{
if(*str=='+'||*str=='-')
str++;
return scanUnsignedint(str);
}
bool isNumeric(char* string)
{
//小数
//科学计数法(底数,指数都可能有正负号,e大小写)
//正负号
if(string == NULL)
return false;
bool numer=jumpoverchar(string);
if(*string=='.')
{
++string;
/*.123 2333. 233.2131
所以用||,3种情况*/
numer=scanUnsignedint(string)||numer;
}
if(*string=='e'||*string=='E')
{
++string;
numer=numer&&jumpoverchar(string);
}
return numer&&*string=='\0';
}
int main()
{
char* str="1+23";
bool Res=isNumeric(str);
cout<<Res<<endl;//as
return 0;
}
JAVA解法
说实话这题太麻烦了,之前的C++解法过不了 leetcode(测试case里面竟然有"1 "后面有个空格)
只能用状态机去做
class Solution {
public static boolean isNumber(String s) {
if (s == null) {
return false;
}
if (s.length() > 0 && s.charAt(0) == 'e') {
return false;
}
s = jumpOverChar(s);
if (s.length() > 0 && s.charAt(0) == '.') {
if (s.length() > 1 && isNum(s.charAt(1))) {
s = s.substring(2);
}
s = scanUnsignedInt(s);
} else {
if (s.length() > 0 && (s.charAt(0) == 'e' || s.charAt(0) == 'E')) {
if (s.length() > 1 && isNum(s.charAt(1))) {
s = s.substring(2);
}
s = jumpOverChar(s);
}
}
if (s.length() == 0) {
return true;
}
return false;
}
private static String jumpOverChar(String s) {
if (s.length() > 0 && (s.charAt(0) == '+' || s.charAt(0) == '-')) {
if (s.length() > 1 && isNum(s.charAt(1))) {
s = s.substring(2);
}
}
return scanUnsignedInt(s);
}
private static boolean isNum(char c) {
if (c >= '0' && c <= '9') {
return true;
}
return false;
}
private static String scanUnsignedInt(String s) {
while (s.length() > 0 && s.charAt(0) >= '0' && s.charAt(0) <= '9') {
s = s.substring(1);
}
return s;
}
public static void main(String[] args) {
System.out.println(isNumber("1"));
System.out.println(isNumber("-e1.321"));
System.out.println(isNumber("5e2"));
System.out.println(isNumber("-1E-16"));
System.out.println(isNumber("0"));
}
}