最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)LeetCode(65.驗(yàn)證數(shù)字)

 更新時(shí)間:2021年07月16日 16:26:37   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(65.驗(yàn)證數(shù)字),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 65.Valid Number 驗(yàn)證數(shù)字

Validate if a given string can be interpreted as a decimal number.

Some examples:
"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

Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one. However, here is a list of characters that can be in a valid decimal number:

  • Numbers 0-9
  • Exponent - "e"
  • Positive/negative sign - "+"/"-"
  • Decimal point - "."

Of course, the context of these characters also matters in the input.

Update (2015-02-10):
The signature of the C++ function had been updated. If you still see your function signature accepts a const char * argument, please click the reload button to reset your code definition.

首先,從題目中給的一些例子可以分析出來,我們所需要關(guān)注的除了數(shù)字以外的特殊字符有空格 ‘ ', 小數(shù)點(diǎn) '.', 自然數(shù) 'e/E', 還要加上正負(fù)號(hào) '+/-", 除了這些字符需要考慮意外,出現(xiàn)了任何其他的字符,可以馬上判定不是數(shù)字。下面我們來一一分析這些出現(xiàn)了也可能是數(shù)字的特殊字符:

1. 空格 ‘ ': 空格分為兩種情況需要考慮,一種是出現(xiàn)在開頭和末尾的空格,一種是出現(xiàn)在中間的字符。出現(xiàn)在開頭和末尾的空格不影響數(shù)字,而一旦中間出現(xiàn)了空格,則立馬不是數(shù)字。解決方法:預(yù)處理時(shí)去掉字符的首位空格,中間再檢測(cè)到空格,則判定不是數(shù)字。

2. 小數(shù)點(diǎn) '.':小數(shù)點(diǎn)需要分的情況較多,首先的是小數(shù)點(diǎn)只能出現(xiàn)一次,但是小數(shù)點(diǎn)可以出現(xiàn)在任何位置,開頭(".3"), 中間("1.e2"), 以及結(jié)尾("1." ), 而且需要注意的是,小數(shù)點(diǎn)不能出現(xiàn)在自然數(shù) 'e/E' 之后,如 "1e.1" false, "1e1.1" false。還有,當(dāng)小數(shù)點(diǎn)位于末尾時(shí),前面必須是數(shù)字,如 "1."  true," -." false。解決方法:開頭中間結(jié)尾三個(gè)位置分開討論情況。

3. 自然數(shù) 'e/E':自然數(shù)的前后必須有數(shù)字,即自然數(shù)不能出現(xiàn)在開頭和結(jié)尾,如 "e" false,  ".e1" false, "3.e" false, "3.e1" true。而且小數(shù)點(diǎn)只能出現(xiàn)在自然數(shù)之前,還有就是自然數(shù)前面不能是符號(hào),如 "+e1" false, "1+e" false. 解決方法:開頭中間結(jié)尾三個(gè)位置分開討論情況。

4. 正負(fù)號(hào) '+/-",正負(fù)號(hào)可以再開頭出現(xiàn),可以再自然數(shù)e之后出現(xiàn),但不能是最后一個(gè)字符,后面得有數(shù)字,如  "+1.e+5" true。解決方法:開頭中間結(jié)尾三個(gè)位置分開討論情況。

下面我們開始正式分開頭中間結(jié)尾三個(gè)位置來討論情況:

1. 在討論三個(gè)位置之前做預(yù)處理,去掉字符串首尾的空格,可以采用兩個(gè)指針分別指向開頭和結(jié)尾,遇到空格則跳過,分別指向開頭結(jié)尾非空格的字符。

2. 對(duì)首字符處理,首字符只能為數(shù)字或者正負(fù)號(hào) '+/-",我們需要定義三個(gè)flag在標(biāo)示我們是否之前檢測(cè)到過小數(shù)點(diǎn),自然數(shù)和正負(fù)號(hào)。首字符如為數(shù)字或正負(fù)號(hào),則標(biāo)記對(duì)應(yīng)的flag,若不是,直接返回false。

3. 對(duì)中間字符的處理,中間字符會(huì)出現(xiàn)五種情況,數(shù)字,小數(shù)點(diǎn),自然數(shù),正負(fù)號(hào)和其他字符。

若是數(shù)字,標(biāo)記flag并通過。

若是自然數(shù),則必須是第一次出現(xiàn)自然數(shù),并且前一個(gè)字符不能是正負(fù)號(hào),而且之前一定要出現(xiàn)過數(shù)字,才能標(biāo)記flag通過。

若是正負(fù)號(hào),則之前的字符必須是自然數(shù)e,才能標(biāo)記flag通過。

若是小數(shù)點(diǎn),則必須是第一次出現(xiàn)小數(shù)點(diǎn)并且自然數(shù)沒有出現(xiàn)過,才能標(biāo)記flag通過。

若是其他,返回false。

4. 對(duì)尾字符處理,最后一個(gè)字符只能是數(shù)字或小數(shù)點(diǎn),其他字符都返回false。

若是數(shù)字,返回true。

若是小數(shù)點(diǎn),則必須是第一次出現(xiàn)小數(shù)點(diǎn)并且自然數(shù)沒有出現(xiàn)過,還有前面必須是數(shù)字,才能返回true。

解法一:

class Solution {
public:
    bool isNumber(string s) {
        int len = s.size();
        int left = 0, right = len - 1;
        bool eExisted = false;
        bool dotExisted = false;
        bool digitExisited = false;
        // Delete spaces in the front and end of string
        while (s[left] == ' ') ++left;
        while (s[right] == ' ') --right;
        // If only have one char and not digit, return false
        if (left >= right && (s[left] < '0' || s[left] > '9')) return false;
        //Process the first char
        if (s[left] == '.') dotExisted = true;
        else if (s[left] >= '0' && s[left] <= '9') digitExisited = true;
        else if (s[left] != '+' && s[left] != '-') return false;
        // Process the middle chars
        for (int i = left + 1; i <= right - 1; ++i) {
            if (s[i] >= '0' && s[i] <= '9') digitExisited = true;
            else if (s[i] == 'e' || s[i] == 'E') { // e/E cannot follow +/-, must follow a digit
                if (!eExisted && s[i - 1] != '+' && s[i - 1] != '-' && digitExisited) eExisted = true;
                else return false;
            } else if (s[i] == '+' || s[i] == '-') { // +/- can only follow e/E
                if (s[i - 1] != 'e' && s[i - 1] != 'E') return false;                
            } else if (s[i] == '.') { // dot can only occur once and cannot occur after e/E
                if (!dotExisted && !eExisted) dotExisted = true;
                else return false;
            } else return false;
        }
        // Process the last char, it can only be digit or dot, when is dot, there should be no dot and e/E before and must follow a digit
        if (s[right] >= '0' && s[right] <= '9') return true;
        else if (s[right] == '.' && !dotExisted && !eExisted && digitExisited) return true;
        else return false;
    }
};

上面的寫法略為復(fù)雜,我們嘗試著來優(yōu)化一下,根據(jù)上面的分析,所有的字符可以分為六大類,空格,符號(hào),數(shù)字,小數(shù)點(diǎn),自然底數(shù)和其他字符,我們需要五個(gè)標(biāo)志變量,num, dot, exp, sign分別表示數(shù)字,小數(shù)點(diǎn),自然底數(shù)和符號(hào)是否出現(xiàn),numAfterE表示自然底數(shù)后面是否有數(shù)字,那么我們分別來看各種情況:

- 空格: 我們需要排除的情況是,當(dāng)前位置是空格而后面一位不為空格,但是之前有數(shù)字,小數(shù)點(diǎn),自然底數(shù)或者符號(hào)出現(xiàn)時(shí)返回false。

- 符號(hào):符號(hào)前面如果有字符的話必須是空格或者是自然底數(shù),標(biāo)記sign為true。

- 數(shù)字:標(biāo)記num和numAfterE為true。

- 小數(shù)點(diǎn):如果之前出現(xiàn)過小數(shù)點(diǎn)或者自然底數(shù),返回false,否則標(biāo)記dot為true。

- 自然底數(shù):如果之前出現(xiàn)過自然底數(shù)或者之前從未出現(xiàn)過數(shù)字,返回false,否則標(biāo)記exp為true,numAfterE為false。

- 其他字符:返回false。

最后返回num && numAfterE即可。

解法二:

class Solution {
public:
    bool isNumber(string s) {
        bool num = false, numAfterE = true, dot = false, exp = false, sign = false;
        int n = s.size();
        for (int i = 0; i < n; ++i) {
            if (s[i] == ' ') {
                if (i < n - 1 && s[i + 1] != ' ' && (num || dot || exp || sign)) return false;
            } else if (s[i] == '+' || s[i] == '-') {
                if (i > 0 && s[i - 1] != 'e' && s[i - 1] != ' ') return false;
                sign = true;
            } else if (s[i] >= '0' && s[i] <= '9') {
                num = true;
                numAfterE = true;
            } else if (s[i] == '.') {
                if (dot || exp) return false;
                dot = true;
            } else if (s[i] == 'e') {
                if (exp || !num) return false;
                exp = true;
                numAfterE = false;
            } else return false;
        }
        return num && numAfterE;
    }
};

這道題給了例子不夠用,下面這些例子都是我在調(diào)試的過程中出現(xiàn)過的例子,用來參考:

string s1 = "0"; // True
string s2 = " 0.1 "; // True
string s3 = "abc"; // False
string s4 = "1 a"; // False
string s5 = "2e10"; // True

string s6 = "-e10"; // False
string s7 = " 2e-9 "; // True
string s8 = "+e1"; // False
string s9 = "1+e"; // False
string s10 = " "; // False

string s11 = "e9"; // False
string s12 = "4e+"; // False
string s13 = " -."; // False
string s14 = "+.8"; // True
string s15 = " 005047e+6"; // True

string s16 = ".e1"; // False
string s17 = "3.e"; // False
string s18 = "3.e1"; // True
string s19 = "+1.e+5"; // True
string s20 = " -54.53061"; // True

string s21 = ". 1"; // False

到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(驗(yàn)證數(shù)字)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)驗(yàn)證數(shù)字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • linux內(nèi)核select/poll,epoll實(shí)現(xiàn)與區(qū)別

    linux內(nèi)核select/poll,epoll實(shí)現(xiàn)與區(qū)別

    這篇文章主要介紹了linux內(nèi)核select/poll,epoll實(shí)現(xiàn)與區(qū)別,需要的朋友可以參考下
    2016-11-11
  • C++空類及沒有成員變量的類的大小實(shí)例分析

    C++空類及沒有成員變量的類的大小實(shí)例分析

    這篇文章主要介紹了C++空類及沒有成員變量的類的大小,對(duì)于初學(xué)者更好的了解C++的指針及類的存儲(chǔ)結(jié)構(gòu)很有幫助,需要的朋友可以參考下
    2014-07-07
  • C++經(jīng)典例題之字符串特定規(guī)則反轉(zhuǎn)問題的解法

    C++經(jīng)典例題之字符串特定規(guī)則反轉(zhuǎn)問題的解法

    這篇文章主要介紹了如何解決字符串反轉(zhuǎn)問題,通過將字符串按每2k個(gè)字符為一個(gè)區(qū)間進(jìn)行劃分,并使用雙指針方法來確定實(shí)際反轉(zhuǎn)的邊界,最終實(shí)現(xiàn)字符串按特定規(guī)則進(jìn)行反轉(zhuǎn),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • C++讀取wav文件中的PCM數(shù)據(jù)

    C++讀取wav文件中的PCM數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了C++讀取wav文件中的PCM數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 解析C++引用

    解析C++引用

    引用是C++引入的新語言特性,是C++常用的一個(gè)重要內(nèi)容之一。在工作中發(fā)現(xiàn),許多人使用它僅僅是想當(dāng)然,在某些微妙的場(chǎng)合,很容易出錯(cuò),究其原由,大多因?yàn)闆]有搞清本源。在本篇中將對(duì)引用進(jìn)行詳細(xì)討論,希望對(duì)大家更好地理解和使用引用起到拋磚引玉的作用
    2021-06-06
  • 八皇后問題實(shí)現(xiàn)代碼分享

    八皇后問題實(shí)現(xiàn)代碼分享

    八皇后問題,是一個(gè)古老而著名的問題,是回溯算法的典型案例,這篇文章主要介紹了八皇后問題實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-02-02
  • C++實(shí)現(xiàn)LeetCode(208.實(shí)現(xiàn)字典樹(前綴樹))

    C++實(shí)現(xiàn)LeetCode(208.實(shí)現(xiàn)字典樹(前綴樹))

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(208.實(shí)現(xiàn)字典樹(前綴樹)),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++實(shí)現(xiàn)LeetCode(108.將有序數(shù)組轉(zhuǎn)為二叉搜索樹)

    C++實(shí)現(xiàn)LeetCode(108.將有序數(shù)組轉(zhuǎn)為二叉搜索樹)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(108.將有序數(shù)組轉(zhuǎn)為二叉搜索樹),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++自定義實(shí)現(xiàn)比較器

    C++自定義實(shí)現(xiàn)比較器

    這篇文章主要為大家詳細(xì)介紹了如何使用C++自定義實(shí)現(xiàn)比較器,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • C語言大作業(yè)之圖書管理系統(tǒng)的實(shí)現(xiàn)詳程

    C語言大作業(yè)之圖書管理系統(tǒng)的實(shí)現(xiàn)詳程

    隨著網(wǎng)絡(luò)技術(shù)的高速發(fā)展,計(jì)算機(jī)應(yīng)用的普及,利用計(jì)算機(jī)對(duì)圖書館的日常工作進(jìn)行管理勢(shì)在必行,趁著寒假時(shí)間手把手帶你用C語言實(shí)現(xiàn)一個(gè)圖書管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2022-01-01

最新評(píng)論

新津县| 定陶县| 静宁县| 凌海市| 北碚区| 新晃| 凤冈县| 衡阳县| 洪湖市| 德保县| 樟树市| 吐鲁番市| 康保县| 扶沟县| 淄博市| 会东县| 墨竹工卡县| 合水县| 永定县| 松江区| 盐边县| 邵阳市| 南召县| 虞城县| 广昌县| 洪洞县| 惠水县| 绍兴市| 黔西| 荃湾区| 南召县| 太谷县| 姚安县| 渑池县| 河北省| 东兴市| 孟州市| 宁安市| 呼图壁县| 抚州市| 沅江市|