劍指Offer Java版 面試題20:表示數(shù)值的字符串

題目:請實現(xiàn)一個函數(shù)用來判斷字符串是否表示數(shù)值(包括整數(shù)和小數(shù))。例如棋傍,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示數(shù)值难审。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

練習地址

https://www.nowcoder.com/practice/6f8c901d091949a5837e24bb82a731f2
https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/

參考答案

class Solution {
    private int i;

    public boolean isNumber(String s) {
        if (s == null) {
            return false;
        }
        char[] str = s.trim().toCharArray();
        i = 0;
        boolean numeric = scanInteger(str);

        // 如果出現(xiàn)'.'麸拄,則接下來是數(shù)字的小數(shù)部分
        if (i < str.length && str[i] == '.') {
            i++;
            // 下面一行代碼用||的原因:
            // 1. 小數(shù)可以沒有整數(shù)部分黔姜,如 .123 等于 0.123;
            // 2. 小數(shù)點后面可以沒有數(shù)字淮椰,如 233. 等于 233.0纳寂;
            // 3. 當然,小數(shù)點前面和后面可以都有數(shù)字毙芜,如 233.666
            numeric = scanUnsignedInteger(str) || numeric;
        }
        // 如果出現(xiàn) 'e' 或者 'E',則接下來是數(shù)字的指數(shù)部分
        if (i < str.length && (str[i] == 'e' || str[i] == 'E')) {
            i++;
            // 下面一行代碼用&&的原因:
            // 1. 當 e 或 E 前面沒有數(shù)字時猾浦,整個字符串不能表示數(shù)字灯抛,如 .e1、e1对嚼;
            // 2. 當 e 或 E 后面沒有整數(shù)時,整個字符串不能表示數(shù)字纵竖,如 12e、12e+5.4
            numeric = numeric && scanInteger(str);
        }
        return numeric && i == str.length;
    }

    private boolean scanUnsignedInteger(char[] str) {
        int before = i;
        while (i < str.length && str[i] >= '0' && str[i] <= '9') {
            i++;
        }
        // 當 str 中存在若干 0~9 的數(shù)字時已脓,返回 true
        return i > before;
    }

    private boolean scanInteger(char[] str) {
        if (i == str.length) {
            return false;
        }
        if (str[i] == '+' || str[i] == '-') {
            i++;
        }
        return scanUnsignedInteger(str);
    }
}

復(fù)雜度分析

  • 時間復(fù)雜度:O(n)通殃。
  • 空間復(fù)雜度:O(1)。

??劍指Offer Java版目錄
??劍指Offer Java版專題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末堕担,一起剝皮案震驚了整個濱河市霹购,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌齐疙,老刑警劉巖旭咽,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轻专,死亡現(xiàn)場離奇詭異,居然都是意外死亡请垛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門漫拭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來混稽,“玉大人审胚,你說我怎么就攤上這事膳叨。” “怎么了菲嘴?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵汰翠,是天一觀的道長。 經(jīng)常有香客問我健田,道長佛纫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任跟磨,我火速辦了婚禮,結(jié)果婚禮上抵拘,老公的妹妹穿的比我還像新娘型豁。我一直安慰自己,他們只是感情好迎变,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布衣形。 她就那樣靜靜地躺著,像睡著了一般谆吴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笋熬,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天腻菇,我揣著相機與錄音昔馋,去河邊找鬼糖耸。 笑死,一個胖子當著我的面吹牛蔬捷,可吹牛的內(nèi)容都是我干的榔袋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼妥粟,長吁一口氣:“原來是場噩夢啊……” “哼吏够!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锅知,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤售睹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后昌妹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡烂叔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年蒜鸡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逢防。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡贰健,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伶椿,到底是詐尸還是另有隱情氓侧,我是刑警寧澤导狡,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布旱捧,位于F島的核電站,受9級特大地震影響枚赡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贫橙,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疲迂。 院中可真熱鬧,春花似錦尤蒿、人聲如沸幅垮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至避乏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拍皮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工铆帽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留德谅,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓愧驱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親组砚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容