【剑指offer】 面试题20:表示数值的字符串

该博客介绍了如何判断一个字符串是否表示数值,包括整数、小数和指数部分的合法性。解题思路涉及符号、整数、小数点和指数的判断,并提供了C++的主要代码示例,强调了这个问题对思维全面性的要求。
摘要由CSDN通过智能技术生成

面试题–【剑指Offer】 题目解答

题目要求

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

解题思路

主要是判断一个表示数值的字符串是否合法,判断主要包括:整数部分,小数部分,指数部分,符号部分。 我们做题的思想就是判断上述各部分是否合法,如果有一部分不合法,那么整体就是不合法的。

其实本题的难点就是如何去对整数,小数,指数,符号判断合法?
符号部分:
第一次符号出现的位置可能是开头,也可能是在指数部分e/E之后(注意必须是紧挨着e/E)。
第二次符号出现的位置只能是指数部分,紧挨着(e/E)。
整数部分:
字符是否在0-9之间。
小数部分:
不能含有多个小数点,并且不能出现在指数e/E的后边。
指数部分:
不能有多个e/E指数部分,指数e/E符号后边一定要是整数。

主要代码c++

class Solution {
public:
    bool isNumeric(char* str)
    {
        // 标记符号、小数点、e是否出现过
        bool sign = false, decimal = false, hasE = false;
        for (int i = 0; i < strlen(str); i++) {
            // 先判断正负号:第一次出现的话不是在开头就是在指数e/E紧接着。第二次出现一定紧接着e/E
            if(str[i] == '+' || str[i] == '-')
            {
                if(!sign && i > 0 && str[i-1] != 'e' && str[i-1] != 'E') // 第一次符号
                    return false;
                if(sign && str[i-1] != 'e' && str[i-1] != 'E') // 第二次符号
                    return false;
                sign = true;
            }
            else if (str[i] < '0' || str[i] > '9') // 判断字符是不是合法,如'a'通过ascii码的数值
                return false;
            else if(str[i] == '.') // 判断小数点:不能重复出现,不能出现在e/E后面
            {
                if(hasE || decimal)
                    return false;
                decimal = true;
            }
            else if(str[i] == 'e' || str[i] == 'E') // 判断指数:后边不能没有整数,不能有两个e
            {
                if(i == (strlen(str) - 1)) // 指数在最后一位不合法
                    return false;
                if(hasE) // 指数又接指数不合法
                    return false;
                hasE = true;
            }
        }
        return true;
    }
};

总结

初次见到本题的时候有点无从下手,实际上我们只需把题目分成若干个小问题即可,对符号,整数,小数,指数分别分析其不合法的情况再组合起来就好。题目虽小但是非常考察我们思维的全面性,建议多思考几遍!另外本题源于剑指offer第20题,用循环的方法和标记变量相对于书中的方法更加好理解。大家可以结合书上的解法,一起学习。

顺便说一句,用字符串表示数值经常是我们解决大数问题的一个方法,大家可以留意一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值