剑指Offer(第2版)——面试题20:表示数值的字符串

题目:

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

补充知识点:
e/E科学计数法:这是一种记数的方法。把一个数表示成a(1≤a<10,n为整数)与10的n次幂相乘的形式 。
例如:19971400000000=1.99714×10^13。计算器或电脑表达10的幂是一般是用E或e,也就是1.99714E13。
相关公式:
aEb=a×10^b
aE+b=a×10^b
aE-b=a×10^(-b)

解题思路
  • 表示数值的字符串遵循模式:A[.[B]][e|EC]或者.B[e|EC]。
  • A为数值的整数部分,B紧跟着小数点为数值的小数部分,C紧跟着‘e’或者‘E’为数值的指数部分。
  • 指数符号‘e’或‘E’前后必须有数字,指数符号只能出现一次。
  • 小数点只能出现在指数符号之前;只能出现一次;不能出现在最后一位上。
  • 正负号‘+’,‘-’第一次只能出现在第一个字符或者指数符号后;第二次只能出现在指数符号后;不能出现在最后一位。

2.代码:

class Solution{
public:
    bool isNumeric(char* str){
        if(str == NULL)  return false;

        //标记 '+'-'符号,小数点,指数符号e/E是否出现过
        bool sign = false, decimal = false, hasE = false;
        for(int i = 0; i < strlen(str); i++){
            //遇到'e'或者'E'
            if(str[i] == 'e' || str[i] == 'E'){
                //指数符号前必须有整数
                if(i == 0)  return false;
                //指数符号后必须有整数
                if(i == strlen(str)-1) return false;
                //只能有一个指数符号
                if(hasE) return false;
                hasE = true;
            }
            //遇到'.'
            else if(str[i] == '.'){
                //小数点只能出现在指数符号之前
                if(hasE)  return false; 
                // 小数点只能出现一次
                if(decimal) return false;
                // 小数点不能出现在最后一位上
                if(i == strlen(str) - 1)  return false;
                decimal = true;
            }
            //遇到'+'或者'-'
            else if(str[i] == '-' || str[i] == '+'){
                //第一次出现+''-'符号只能在第一个字符或者指数符号后
                if(!sign && i != 0 && !hasE) return false;
                //第二出现'+''-'符号只能在指数符号后
                if(sign && !hasE) return false;
                //'+''-'符号不能出现在最后一位上
                if(i == strlen(str) - 1)  return false; 
                sign = true;
            }
            //遇到不法字符
            else if(str[i] < '0' || str[i] > '9') return false;
        }
        return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值