Leetcode高級挑戰(zhàn):簡單計算器

《簡單計算器》在Leetcode中難度為hard浦译,看起來很簡單棒假,里面涉及很多狀態(tài)記錄和匯總,真正做出來還是花了一些時間

1精盅,問題

原題鏈接 https://leetcode.com/problems/basic-calculator/description/

  • 實現(xiàn)一個計算器來計算一個簡單表達式帽哑。表達式中可以包含,左括號叹俏,右括號妻枕,加號,減號粘驰,數(shù)字或者空格
例1
Input: "1 + 1"
Output: 2
例2
Input: "(1+(4+5+2)-3)+(6+8)"
Output: 23
例3
Input: "(3-(2-(5-(9-(4)))))"
Output: 1

2屡谐,分析

  1. 看到問題我首先想到遞歸,依次深入蝌数,最后從最小的計算單位算起愕掏。思路沒問題,但效率肯定不高顶伞。
  2. 如果要效率最高饵撑,最好的算法一定是只經(jīng)過一次遍歷就可以得出結(jié)果剑梳,所以我開始從這個思路下手。
  3. 這個問題可以分解為對每個數(shù)字進行加減法肄梨,沒有括號的情況很簡單阻荒。
  4. 有括號的情況,特別是嵌套的時候众羡,括號里的數(shù)字應(yīng)該做加法還是減法侨赡,需要考慮之前的操作符號。
  5. 比如例3中 "(3-(2-(5-(9-(4)))))"粱侣, 數(shù)字5羊壹, 因為前面2個括號前都是負號,所以對數(shù)字5應(yīng)該做加法

3齐婴,算法

  • 初始化油猫,默認最近的計算符為加號

  • 遍歷表達式中的字符

    • 如果字符為數(shù)字,獲取整個數(shù)字串轉(zhuǎn)化為數(shù)字
      • 根據(jù)最近的計算符累加
    • 如果字符為:左括號
      • 括號前的操作符入棧
      • 計算出棧中所有操作符累計結(jié)果
      • 設(shè)置最近的計算符為加號
    • 如果字符為:加號
      • 設(shè)置最近的計算符為加號
    • 如果字符為:減號
      • 設(shè)置最近的計算符為負號
    • 如果字符為:右括號
      • 設(shè)置最近的計算符為加號
      • 括號前的操作符出棧
  • 返回最終結(jié)果

4柠偶,完整代碼

public int calculate(String s) {
        // 以下使用boolean類型來表示加加法情妖,true為加法,false為減法
        boolean operArr[] = new boolean[s.length()];
        boolean finalOperInArr = true;
        int operOff = 0;

        int ret = 0;
        boolean lastOperPlus = true;

        for(int i=0; i<s.length(); i ++){
            if (Character.isDigit(s.charAt(i))) {
                // 獲得整個數(shù)字
                int sum = s.charAt(i) - '0';
                while (i + 1 < s.length() && Character.isDigit(s.charAt(i + 1))) {
                    sum = sum * 10 + s.charAt(i + 1) - '0';
                    i++;
                }

                // 根據(jù)最近的操作符累加
                if(lastOperPlus == finalOperInArr)
                    ret += sum;
                else
                    ret -= sum;
            }

            if(s.charAt(i)=='('){
                // 操作符入棧
                operArr[operOff++] = lastOperPlus;
                finalOperInArr = finalOperInArr == lastOperPlus;
                lastOperPlus = true;
            }else if(s.charAt(i) == '+'){
                lastOperPlus = true;
            }else if(s.charAt(i) == '-') {
                lastOperPlus = false;
            }else if(s.charAt(i)==')'){
                lastOperPlus = true;
                // 操作符出棧
                finalOperInArr = finalOperInArr == operArr[--operOff];
            }
        }

        return ret;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诱担,一起剝皮案震驚了整個濱河市毡证,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蔫仙,老刑警劉巖料睛,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異摇邦,居然都是意外死亡恤煞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門施籍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來居扒,“玉大人,你說我怎么就攤上這事丑慎√酰” “怎么了?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵立哑,是天一觀的道長。 經(jīng)常有香客問我姻灶,道長铛绰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任产喉,我火速辦了婚禮捂掰,結(jié)果婚禮上敢会,老公的妹妹穿的比我還像新娘。我一直安慰自己这嚣,他們只是感情好鸥昏,可當(dāng)我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姐帚,像睡著了一般吏垮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上罐旗,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天膳汪,我揣著相機與錄音,去河邊找鬼九秀。 笑死遗嗽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鼓蜒。 我是一名探鬼主播痹换,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼都弹!你這毒婦竟也來了娇豫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤缔杉,失蹤者是張志新(化名)和其女友劉穎锤躁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體或详,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡系羞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了霸琴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椒振。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖梧乘,靈堂內(nèi)的尸體忽然破棺而出澎迎,到底是詐尸還是另有隱情,我是刑警寧澤选调,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布夹供,位于F島的核電站,受9級特大地震影響仁堪,放射性物質(zhì)發(fā)生泄漏哮洽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一弦聂、第九天 我趴在偏房一處隱蔽的房頂上張望鸟辅。 院中可真熱鬧氛什,春花似錦、人聲如沸匪凉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽再层。三九已至贸铜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間树绩,已是汗流浹背萨脑。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饺饭,地道東北人渤早。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像瘫俊,于是被迫代替她去往敵國和親鹊杖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,666評論 2 350

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

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)扛芽,也就是一...
    悟名先生閱讀 4,132評論 0 13
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,375評論 0 5
  • 〇骂蓖、前言 本文共108張圖,流量黨請慎重川尖! 歷時1個半月登下,我把自己學(xué)習(xí)Python基礎(chǔ)知識的框架詳細梳理了一遍。 ...
    Raxxie閱讀 18,934評論 17 410
  • lmain函數(shù)中執(zhí)行了一個UIApplicationMain這個函數(shù)llintUIApplicationMain(...
    Mr_董閱讀 155評論 0 0
  • 這是我在簡書的009篇記錄 1盤點自己做過什么叮喳,最近對什么比較關(guān)注 不設(shè)置條數(shù) 2羅列自己的興趣 5個 興趣的定義...
    范范范范同學(xué)閱讀 915評論 0 1