[Leetcode] 65. Valid Number 解题报告

本文是一篇关于LeetCode第65题‘Valid Number’的解题报告,主要讨论如何验证一个字符串是否表示合法的数字,并探讨将其转换为double类型的可能。解题思路涉及对字符串边缘情况的全面考量,通过逐步遍历并检查字符来判断合法性。文章还提及,若要求转换为double,需考虑溢出和其他特殊情形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

Validate if a given string is numeric.

Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true

Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.

思路

这种题目没有什么算法可言,完全考察的是对corner case的考虑是否完全。下面代码在注释中给出了处理各种corner case的情况。其基本思路如下:设置一个索引计数器,判断走到了字符串的哪个位置;再设置一个digit计数器,判断某些部分的digit的个数是否合法。然后就是一步步从前往后走了,一旦遇到非法情况就返回false。等到一直走到末尾的时候还没发现非法情况,就返回true。

代码

class Solution {
public:
    bool isNumber(string s) {
        int i = 0;                              // the index
        int k = 0;                              // the count for digits
        int len = s.size();
        while (s[i] == ' ') ++i;                // remove prefix ' '
        if (s[i] == '+' || s[i] == '-') ++i;    // tackle the sign part
        while (isdigit(s[i])) ++i, ++k;         // the integer part
        if(s[i] == '.') ++i;                    // the seperator
        while (isdigit(s[i])) ++i, ++k;         // the fraction part
        if (k == 0) return false;               // no digits found
        if (s[i] == 'e' || s[i] == 'E') {       // same as integer part
            ++i, k = 0;
            if(s[i] == '+' || s[i] == '-') ++i;
            while(isdigit(s[i])) ++i, ++k;
            if(k == 0) return false;
        }
        while (s[i] == ' ') ++i;                // remove the suffix
        return i == len;
    }
};
Follow Up

如果不仅仅是判断合法性,而是要求将一个字符串转换成为一个double类型的数据呢?其实Leetcode上面也有完全类似的题目,可以参考,会发现两者的代码非常类似。不过在面试的时候,最好和面试官讨论各种情况,例如如果溢出呢?其它各种特殊情况如何处理?



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值