LeetCode No.65

有效數(shù)字

驗(yàn)證給定的字符串是否可以解釋為十進(jìn)制數(shù)字。

例如:

"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
" -90e3 " => true
" 1e" => false
"e3" => false
" 6e-1" => true
" 99e2.5 " => false
"53.5e93" => true
" --6 " => false
"-+3" => false
"95a54e53" => false

說明: 我們有意將問題陳述地比較模糊。在實(shí)現(xiàn)代碼之前,你應(yīng)當(dāng)事先思考所有可能的情況。這里給出一份可能存在于有效十進(jìn)制數(shù)字中的字符列表:

數(shù)字 0-9
指數(shù) - "e"
正/負(fù)號(hào) - "+"/"-"
小數(shù)點(diǎn) - "."
當(dāng)然,在輸入中,這些字符的上下文也很重要。

題目分析

  1. 這題我感覺是一種代碼實(shí)現(xiàn)問題,考查考慮問題是否全面?
    沒有什么特別的算法思想,想清楚判定數(shù)字的流程,然后一路判斷下來即可。但是要實(shí)現(xiàn)你原計(jì)劃的流程,還是要好好打理一下自己的代碼。

  2. 字符特征
    2.1 可能包含”0~9“,”e“,”.“,“+”,“-”,” “。
    2.2 ”e” 允許出現(xiàn)的次數(shù)?還要考慮“e”后是否允許出現(xiàn)”." , ”+“,”-“?是否允許作為開頭結(jié)尾?前面是否一定要有數(shù)字?
    2.3 “." 允許出現(xiàn)的次數(shù)? ”." 后是否允許出現(xiàn) “e" , "+ " ,"- "?是否允許作為開頭結(jié)尾 ?前面是否一定要有數(shù)字?
    2.4 ”+“ ,”-“,最多出現(xiàn)兩次,一次在冪,一次在指數(shù),且一定位于其他符號(hào)之前,且不能作為結(jié)尾
    2.5 ”0~9“ ,”0“是否允許在冪 或者 指數(shù) 或者 小數(shù)部分 的首部,是否允許”0“結(jié)尾的小數(shù)部分。
    2.6 ” “,只能作為開頭結(jié)尾。
    2.7 整個(gè)數(shù),必須要有數(shù)字出現(xiàn)。

  3. 判斷流程
    3.1 數(shù)前空格清除
    3.2 首位判斷+ - 號(hào),然后進(jìn)入冪部分/整數(shù)部分
    3.3 正常判斷數(shù)字,遇到 ”." 進(jìn)入小數(shù)部分,“e” 進(jìn)入指數(shù)部分,其余false。
    3.4.1 小數(shù)部分,標(biāo)記小數(shù)點(diǎn)已經(jīng)用過,不能再出現(xiàn),其余照常。
    3.4.2 指數(shù)部分,檢查e前是否有數(shù)字,”+“ ”-“可以再用,重置”+-“的標(biāo)志位,小數(shù)點(diǎn)不能用了,小數(shù)點(diǎn)標(biāo)志位置false,當(dāng)然e也不能再用了。繼續(xù)照常檢查數(shù)字。
    3.5 檢查到” “,” “只能作為末尾出現(xiàn),因此直接跳出主體循環(huán),進(jìn)入尾部判斷環(huán)節(jié)。
    3.6 數(shù)的結(jié)尾檢查,不能是”e", "+ " "-" ,但可以是“ . ”。
    3.7尾部清洗,一路檢查是否是“ ”,遇到個(gè)不是的則false。
    3.8 檢查全部通過,但它也要有數(shù)字才可能是數(shù)!return HasNum;

題解代碼

class Solution {
public:
    bool isNumber(string s) 
    {   //0開頭結(jié)尾 true
        //多個(gè)e  false
        //e左右兩邊要有數(shù) 
        //指數(shù)不能為小數(shù)
        int i=0;
        bool UsedSign=false;
        bool UsedCom=false;
        bool UsedExp=false;
        bool HasNum=false;
        //首部空格清除
        while(i<s.size())
        {
            if(s[i]!=' ')
                break;
            i++;
        }

        //首位判斷符號(hào)位
        if(i<s.size() && (s[i]=='+' || s[i]=='-') )//符號(hào)
        {
            UsedSign=true;
            i++;
        }



        //主體判斷
        for(;i<s.size();i++)
        {
            if(s[i]>='0' && s[i]<='9')
            {   
                HasNum=true;
                continue;
            }
            else if(s[i]=='+' || s[i]=='-')//主要用來判斷指數(shù)的符號(hào)
            {
                if(UsedSign==false && s[i-1]=='e')
                {
                    UsedSign=true;
                    continue;
                }
                else
                    return false;
            }
            else if(s[i]=='.')//小數(shù)點(diǎn)
            {
                if(UsedCom==false)
                {
                    UsedCom=true;
                    continue;
                }
                else
                    return false;
            }
            else if(s[i]=='e')//指數(shù)符號(hào)
            {
                if(UsedExp==false && HasNum==true) //e前需有數(shù)字
                {
                    UsedExp=true;
                    UsedSign=false;//重置符號(hào)狀態(tài)位,指數(shù)也可以帶符號(hào)
                    UsedCom=true;//指數(shù)不能是小數(shù)
                    continue;
                    
                }
                else
                    return false;
            }
            else if(s[i]==' ') //尾部空格
                break;
            else
                return false;
        }

        if(s[i-1]=='e' ||s[i-1]=='+' || s[i-1]=='-')//e + -結(jié)尾 不行
            return false;

        while(i<s.size())//尾部空格清除
        {
            if(s[i]!=' ')
                return false;
            i++;
        }

        return HasNum;
    }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 3,165評(píng)論 0 3
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,911評(píng)論 0 13
  • DAY 01 JAVA簡述 Java是由SUN公司在1995年推出的一門高級(jí)編程語言,是現(xiàn)今服務(wù)器端的首選編程語言...
    周書達(dá)閱讀 1,095評(píng)論 0 0
  • 在公交站臺(tái)等車的時(shí)候,一個(gè)80歲阿婆走過來拽我的手,一口吳儂軟語,仔細(xì)聽才明白,她要坐"蹦蹦車"(電動(dòng)三輪車),可...
    Ivy楊平華閱讀 395評(píng)論 0 0
  • 這本書讀了近二十天,我用"澀″字來形容。故事以富家子凱末爾先生追他的一位窮親戚美麗的十八歲芙頌的故事! 我以寫作的...
    淑女_2e7d閱讀 1,321評(píng)論 21 40

友情鏈接更多精彩內(nèi)容