没有输出的输入是不完整的

0%

剑指offer-表示数值的字符串

本文为剑指 offer 系列第五十篇。
主要知识点为字符串,重点在于细心,认真的去判断成为数值的条件,然后再去做题就比较快。

题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,“-123”,“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。

解题思路

这个题目主要要考虑以下的问题

  1. 小数点,正负号,指数标志可能会出现多次的问题。解决方式是设置一个标志,用来记录它们之前是否已经出现。
  2. 直接以小数点或者指数标志或者正负号结尾:解决方式在每个条件结束的时候进行一次是否到结尾的判断
  3. string以‘\0’为标志结束。可以用来结束循环。
  4. 非法字符的问题。 对于前面没有处理的其他的非法情况都直接返回false

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class Solution {
public:
bool isNumeric(char* string)
{
if(string == NULL){
return false;
}

// 应对仅仅只有+或者-的情况
if(*string == '+' || *string == '-'){
string++;
}
if(*string == '\0'){
return false;
}

//标记小数点、整数部分、指数部分是否存在,
bool point = false, numint = false, nume = false;
while(*string != '\0'){
//处理小数
if(*string == '.'){
if( point || nume) {
return false;
}
string++;
point = true;
if(*string == '\0'){
return false;
}
}
//处理科学计数法
else if(*string == 'E' || *string == 'e'){
if(numint == false || nume){
return false;
}
string++;
nume = true;
if(*string == '+' || *string == '-'){
string++;
}
if(*string == '\0'){
return false;
}
}
//处理正常数据
else if(*string >= '0' && *string <= '9'){
numint = true;
string++;
}else{
return false;
}
}
return true;
}
};

时间复杂度为O(n),空间复杂度为O(1)

以上,本题结束!