题目:
补充:true: .1 3. 46.e3 +.8
false: .e1 0e 0.e
我的代码
class Solution {
public:
bool isNumber(string s) {
//去除首尾空格
size_t first_i = 0, last_i = s.length();
while (s[first_i] == ' ' && first_i < last_i){
first_i++;
}//while
while (s[last_i - 1] == ' ' && last_i >= 0){
last_i--;
}//while
size_t i;
unsigned int jia_jian_num1 = 0; //记录在最前面的+或-号的数目和坐标
int jia_jian_pos1 = 0;
unsigned int jia_jian_num2 = 0; //记录在指数e或E后面的+或-号的数目和坐标nt
int jia_jian_pos2 = 0;
unsigned int dian_num = 0; //记录'.'的数目和坐标
int dian_pos = 0;
unsigned int e_num = 0; //记录e或E的数目和坐标
int e_pos = 0;
unsigned int digit_num = 0; //记录数字
for (i = first_i; i<last_i; i++)
{
if (s[i] == '+' || s[i] == '-') //存在+或-号,则+或-号只能在最前面或是前面有e或E
{
//+或-号在字符最前面,则在该位置合法
if ((i - first_i) == 0)
{
jia_jian_num1++; //记录当前的加减号数目
jia_jian_pos1 = i; //记录坐标
}
else if (s[i - 1] == 'e' || s[i - 1] == 'E') //+或-号前面是e或E,该位置也合法
{
jia_jian_num2++;
jia_jian_pos2 = i;
}
else{ //既不是最前面也不是在指数e或E的后面
//break;
return false;
}
if ((jia_jian_num1 > 1) || (jia_jian_num2 >1)){ //+和-的数目加起来超过1,表明2种情况中是不合法的
// break;
return false;
}
}
else if (s[i] == '.'){ //存在'.'号,则'.'的前面一定存在数字,否则就是不合法
if ((i == first_i) || (isdigit(s[i - 1])) || s[i - 1] == '+' || s[i - 1] == '-'){ //'.'在最前面或前面的字符是数字或+/-,则在该位置合法
dian_num++;
dian_pos = i;
}
else{ //其他条件均不合法
//break;
return false;
}
if (dian_num >1){ //'.'的数目不可能超多1,否则不合法
// break;
return false;
}
}
else if (s[i] == 'e' || s[i] == 'E') //存在e或E, e或E的前面一定是数字
{
if ((i != first_i) && (isdigit(s[i - 1]) || s[i - 1] == '.')) //e的前面有数字则在该位置合法
{
e_num++;
e_pos = i;
}
else{ //其他条件下均不合法
//break;
return false;
}
if (e_num >1){ //e或E的数目最多也只能为1
// break;
return false;
}
}
else if (isdigit(s[i])){ //该字符是数字
digit_num++;
}
else{ //既不是+或-号、也不是'.'、也不是e或E、更不是数字, 则该字符一定不合法
//break;
return false;
}
}//for
//尽管在+或- 、'.'、e或E在相应坐标下符合,但不一定组合在一起就规范,比如+3.1e、1e+ 2e-2.1 -3e+
//发现,若存在在+或- 、'.'、e或E的话,则排序规则是 +/-(1)[xxx].x[xxx]e+/-(2)x[xx] ,其中x表示数字,[xx]表示有多位数字可选
if (digit_num == (last_i - first_i)){ //全是数字
return true;
}
if (digit_num == 0){
return false;
}
//不全是数字的情况
if ((last_i - first_i - digit_num) == 4)
{ //4种符号都存在
//第一:按照 +/-(1)x[xx].[xxxx]e+/-(2)x[xx] 或 +/-(1)[xxx].x[xxx]e+/-(2)x[xx] 的规则组成的合法排序
if ((last_i - 1 > jia_jian_pos2) && (jia_jian_pos2 - e_pos == 1) && (e_pos - dian_pos >= 1) && (dian_pos - jia_jian_pos1 >= 2) && (jia_jian_pos1 == first_i) || ((last_i - 1 > jia_jian_pos2) && (jia_jian_pos2 - e_pos == 1) && (e_pos - dian_pos >= 2) && (dian_pos - jia_jian_pos1 >= 1) && (jia_jian_pos1 == first_i)))
{
return true;
}
else{
return false;
}
}
else if ((last_i - first_i - digit_num) == 3)
{ //有一种符号不存在
//第一:若+/1(1)不存在,则正确的排序是x[xx].x[xxx]e+/-(2)x[xx]
if (jia_jian_num1 == 0)
{
//按照 [xxx].[xxxx]e+/-(2)x[xx] 的规则组成的合法排序
if ((last_i - 1 > jia_jian_pos2) && (jia_jian_pos2 - e_pos == 1) && (e_pos - dian_pos >= 1) && (dian_pos - first_i >= 0))
{
return true;
}
else{
return false;
}
}
else if (jia_jian_num2 == 0)
{
//第二:若+/-(2)不存在,则正确的排序是+/-(1)[xxx].x[xxx]ex[xx]或+/-(1)x[xx].[xxx]ex[xx]
if ((last_i - 1 > e_pos) && (e_pos - dian_pos >= 2) && (dian_pos - jia_jian_pos1 >= 1) && (jia_jian_pos1 == first_i) || ((last_i - 1 > e_pos) && (e_pos - dian_pos >= 1) && (dian_pos - jia_jian_pos1 >= 2) && (jia_jian_pos1 == first_i)))
{
return true;
}
else{
return false;
}
}
else if (e_num == 0)
{
//第三:若e或E不存在,则+/-(2)一定不存在,所以该种情况不合法
return false;
}
else
{
//第四:若'.‘不存在,则正确的排序是+/-(1)x[xxx]e+/-(2)x[xx]
if ((last_i - 1 > jia_jian_pos2) && (jia_jian_pos2 - e_pos == 1) && (e_pos - jia_jian_pos1 >2) && (jia_jian_pos1 == first_i))
{
return true;
}
else{
return false;
}
}
}
else if ((last_i - first_i - digit_num) == 2) //2种符号不存在
{
//经分析,以下4中情况符合要求
if ((jia_jian_num1 == 1) && (dian_num == 1)) //正确的排序规则: +/-(1)[xxx].x[xxx]
{
if ((last_i - 1 > e_pos) && (dian_pos - jia_jian_pos1 >= 1) && (jia_jian_pos1 == first_i))
{
return true;
}
else
{
return false;
}
}
else if ((jia_jian_num1 == 1) && (e_num == 1))
{ //正确的排序规则:+/-(1)x[xxx]ex[xx]
if ((last_i - 1 > e_pos) && (e_pos - jia_jian_pos1 >2) && (jia_jian_pos1 == first_i))
{
return true;
}
else
{
return false;
}
}
else if ((dian_num == 1) && (e_num == 1))
{ //正确的排序规则:[xxx].x[xxx]ex[xx] 或 x[xx].[xxx]ex[xx]
if (((last_i - 1 > e_pos) && (e_pos - dian_pos >= 2) && (dian_pos - first_i >= 0)) || ((last_i - 1 > e_pos) && (e_pos - dian_pos >= 1) && (dian_pos - first_i >= 1)))
{
return true;
}
else
{
return false;
}
}
else if ((e_num == 1) && (jia_jian_num2 == 1))
{ //正确的排序规则:x[xxx]e+/-(2)x[xx]
if ((last_i - 1 > jia_jian_pos2) && (jia_jian_pos2 - e_pos == 1) && (e_pos > first_i))
{
return true;
}
else{
return false;
}
}
else
{
return false;
}
}
else if ((last_i - first_i - digit_num) == 1)
{ //3种符号不存在,则存在以下3中情形
if (jia_jian_num1 == 1){ //形如+x[xx]
if (s.length() >= 2){
return true;
}
else{
return false;
}
}
else if (dian_num == 1){ //形如[xxx].x[xx]
if (s.length() >= 2){
return true;
}
else{
return false;
}
}
else if (e_num == 1){ //形如 x[xx]ex[xx]
if (e_pos > first_i && e_pos < last_i - 1){
return true;
}
else{
return false;
}
}
else{ //+/-(2)是不合法的
return false;
}
}
else
{ //不存在符号,全是数字
return true;
}
}
};
结果:
state: Accepted
runtime:12ms
我的思路:
既然是要符合规则,那么针对特定的符号,如+/-、e/E、.等只要满足它在其相应坐标位置符合规范,那么就可以考虑整体的规范性了。
考虑特定符号在其坐标位置的规范性,只需往前推理其处在这个位置是否合理即可,若连这个都无法满足,则完全可判定其不合格。
当局部满足要求时再判断整体组合是否满足要求即可。
我的总结:
虽然代码较长,但是运行时间却在意料之外。代码中有些判断条件其实是重复的,可以省略。网上有看到更优秀的代码,需学之~~