leetcode-JZ21

题面

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

原题链接

分析

除非接受过专业训练,否则一开始很难想到用自动机(Automata)来做,我是一开始凭直觉列举出不同的规则,然后不断的用测试用例试错,最终通过所有测试用例。

下面的代码没有任何参考意义,注释部分可以看一看。

做完本题最大的意义在于:

  1. 理解官方自动机解法的优越性
  2. 巩固了一些C++基础语法知识

源代码(注释部分即为思路)

class Solution {
public:
    bool isNumber(string s) {
        char candidate[15] = {'0','1','2','3','4','5','6','7','8','9','.','+','-','E','e'};
        set cand;
        for(int i=0; i<15; i++){
            cand.insert(candidate[i]);
        }
        set cand2;
        for(int i=0; i<10; i++){
            cand2.insert(candidate[i]);
        }
        
        //cand3没有存在的必要性
        set cand3;
        for(int i=0; i<13; i++){
            cand3.insert(candidate[i]);
        }

        
        int rawLen = s.length();
        for(int i=0; i0){
                    tmpL--;
                }
                while(s[tmpR]==' ' && tmpR=2){
                        return false;
                    }
                    if(dotPosition==len-1){
                        if(cand2.find(s[dotPosition-1])==cand2.end()){
                            return false;
                        }
                    }
                    // cout<=2){
                        return false;
                    }
                }
                if(s[i]=='+' || s[i]=='-'){
                    if(ePosition==-1){
                        if(i!=0){
                            return false;
                        }
                    }
                    else{
                        if(i!=0){
                            if(i!=ePosition+1){
                                return false;
                            }
                        }
                    }
                }

            }
        }
        //e之后不能再有小数点
        if(ePosition !=-1 && dotPosition !=-1 && ePosition=len){
                    return false;
                }
                for(int k=ePosition+2; k=len){
                    return false;
                }
                for(int k=ePosition+1; k

提交结果:

leetcode-JZ21_第1张图片

官方题解

leetcode-JZ21_第2张图片

原文链接

C++语法知识巩固

  • set类型中,元素可以是char类型
  • char数组的赋值方法:

    char candidate[15] = {'0','1','2','3','4','5','6','7','8','9','.','+','-','E','e'};
    //注意,赋值号右边是大括号
    
    char candidate[6] = "Hello";
    //注意,字符串后面自带一个\0,所以char数组的长度要比字符串视觉长度大1

    实验演示:

    #include 
    #include 
    using namespace std;
    
    int main()
    {
        char candidate[6] = "Hello";
        cout<

    leetcode-JZ21_第3张图片

  • 判断某个元素是否在set类型中:

    set now;
    if(now.find(element)==now.end()){
        //element元素不在now集合中
        cout<<"element元素不在now集合中";
    }

你可能感兴趣的:(c++)