在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

    736. Lisp 語(yǔ)法解析 : DFS 模擬題

    題目描述

    這是 LeetCode 上的 736. Lisp 語(yǔ)法解析 ,難度為 困難。

    Tag : 「DFS」、「模擬」、「哈希表」

    給你一個(gè)類似 Lisp 語(yǔ)句的字符串表達(dá)式 expression,求出其計(jì)算結(jié)果。

    表達(dá)式語(yǔ)法如下所示:

    • 表達(dá)式可以為整數(shù),let 表達(dá)式,add 表達(dá)式,mult 表達(dá)式,或賦值的變量。表達(dá)式的結(jié)果總是一個(gè)整數(shù)。
    • (整數(shù)可以是正整數(shù)、負(fù)整數(shù)、000)
    • let 表達(dá)式采用 “(let v1 e1 v2 e2 … vn en expr)” 的形式,其中 let 總是以字符串 “let”來(lái)表示,接下來(lái)會(huì)跟隨一對(duì)或多對(duì)交替的變量和表達(dá)式,也就是說(shuō),第一個(gè)變量 v1被分配為表達(dá)式 e1 的值,第二個(gè)變量 v2 被分配為表達(dá)式 e2 的值,依次類推;最終 let 表達(dá)式的值為 expr 表達(dá)式的值。
    • add 表達(dá)式表示為 “(add e1 e2)” ,其中 add 總是以字符串 “add” 來(lái)表示,該表達(dá)式總是包含兩個(gè)表達(dá)式 e1、e2 ,最終結(jié)果是 e1 表達(dá)式的值與 e2 表達(dá)式的值之 和 。
    • mult 表達(dá)式表示為 “(mult e1 e2)” ,其中 mult 總是以字符串 “mult” 表示,該表達(dá)式總是包含兩個(gè)表達(dá)式 e1、e2,最終結(jié)果是 e1 表達(dá)式的值與 e2 表達(dá)式的值之 積 。
    • 在該題目中,變量名以小寫字符開始,之后跟隨 000 個(gè)或多個(gè)小寫字符或數(shù)字。為了方便,”add” ,”let” ,”mult” 會(huì)被定義為 `”關(guān)鍵字” ,不會(huì)用作變量名。
    • 最后,要說(shuō)一下作用域的概念。計(jì)算變量名所對(duì)應(yīng)的表達(dá)式時(shí),在計(jì)算上下文中,首先檢查最內(nèi)層作用域(按括號(hào)計(jì)),然后按順序依次檢查外部作用域。測(cè)試用例中每一個(gè)表達(dá)式都是合法的。有關(guān)作用域的更多詳細(xì)信息,請(qǐng)參閱示例。

    示例 1:

    輸入:expression = “(let x 2 (mult x (let x 3 y 4 (add x y))))” 輸出:14 解釋: 計(jì)算表達(dá)式 (add x y), 在檢查變量 x 這是, 在變量的上下文中由最內(nèi)層作用域依次向外檢查。 首先找到 x = 3, 所以此處的 x 只是 3 。 示例 2:

    輸入:expression = “(let x 3 x 2 x)”輸出:2解釋:let 語(yǔ)句中的賦值運(yùn)算按順序處理即可。

    示例 3:

    輸入:expression = “(let x 1 y 2 x (add x y) (add x y))”輸出:5解釋:第一個(gè) (add x y) 計(jì)算結(jié)果是 3,并且將此值賦給了 x 。 第二個(gè) (add x y) 計(jì)算結(jié)果是 3 + 2 = 5 。

    提示:

    • 1<=expression.length<=20001 <= expression.length <= 20001<=expression.length<=2000
    • exprssion 中不含前導(dǎo)和尾隨空格
    • expressoin 中的不同部分(token)之間用單個(gè)空格進(jìn)行分隔
    • 答案和所有中間計(jì)算結(jié)果都符合 32-bit 整數(shù)范圍

    DFS 模擬

    今天身體不舒服,不寫太詳細(xì),題目不難,大家結(jié)合代碼看吧。

    設(shè)計(jì)函數(shù) int dfs(int l, int r, Map map) 函數(shù),代表計(jì)算 s[l…r]s[l…r]s[l…r] 的結(jié)果,答案為 dfs(0,n-1,map),其中 nnn 為字符串的長(zhǎng)度。

    根據(jù)傳入的 [l,r][l, r][l,r] 是否為表達(dá)式分情況討論:

    • 若 s[l]=(s[l] = (s[l]=(,說(shuō)明是表達(dá)式,此時(shí)從 lll 開始往后取,取到空格為止(假設(shè)位置為 idx),從而得到操作 op(其中 op 為 let、add 或 mult 三者之一),此時(shí) op 對(duì)應(yīng)參數(shù)為 [idx+1,r 1][idx + 1, r – 1][idx+1,r 1],也就是需要跳過(guò)位置 rrr(即跳過(guò) op 對(duì)應(yīng)的 ) 符號(hào));
    • 再根據(jù) op 為何種操作進(jìn)一步處理,我們?cè)O(shè)計(jì)一個(gè)「?jìng)魅胱蠖它c(diǎn)找右端點(diǎn)」的函數(shù) int getRight(int left, int end),含義為從 left 出發(fā),一直往右找(不超過(guò) end),直到取得合法的「子表達(dá)式」或「對(duì)應(yīng)的值」。
    • // 對(duì)于 getRight 函數(shù)作用,給大家舉個(gè) 理解吧,其實(shí)就是從 left 出發(fā),找到合法的「子表達(dá)式」或「值」為止 // (let x 2 (mult x (let x 3 y 4 (add x y)))) // a b // 傳入 a 返回 b,代表 [a, b) 表達(dá)式為 (mult x (let x 3 y 4 (add x y))) // (let x 2 (mult x (let x 3 y 4 (add x y)))) // ab // 傳入 a 返回 b,代表 [a, b) 表達(dá)式為 x
    • 否則 s[l…r]s[l…r]s[l…r] 不是表達(dá)式,通過(guò)判斷 s[l…r]s[l…r]s[l…r] 是否有被哈希表記錄來(lái)得知結(jié)果:若在哈希表中有記錄,結(jié)果為哈希表中的映射值,否則結(jié)果為本身所代表的數(shù)值。

    需要注意,根據(jù)「作用域」的定義,我們不能使用全局哈希表,而要在每一層遞歸時(shí),傳入 clone 出來(lái)的 map。

    代碼:

    class Solution { char[] cs; String s; public int evaluate(String _s) { s = _s; cs = s.toCharArray(); return dfs(0, cs.length – 1, new HashMap()); } int dfs(int l, int r, Map map) { if (cs[l] == ‘(‘) { int idx = l; while (cs[idx] != ‘ ‘) idx++; String op = s.substring(l + 1, idx); r–; // 判別為 “(let”、”(add” 或 “(mult” 后,跳過(guò)對(duì)應(yīng)的 “)” if (op.equals(“let”)) { for (int i = idx + 1; i = r) return dfs(i, j – 1, new HashMap(map)); j++; i = j; j = getRight(i, r); int value = dfs(i, j – 1, new HashMap(map)); map.put(key, value); i = j + 1; } return -1; // never } else if (op.equals(“add”)) { int j = getRight(idx + 1, r); int a = dfs(idx + 1, j – 1, new HashMap(map)), b = dfs(j + 1, r, new HashMap(map)); return a + b; } else { int j = getRight(idx + 1, r); int a = dfs(idx + 1, j – 1, new HashMap(map)), b = dfs(j + 1, r, new HashMap(map)); return a * b; } } else { String cur = s.substring(l, r + 1); if (map.containsKey(cur)) return map.get(cur); return Integer.parseInt(cur); } } int getRight(int left, int end) { int right = left, score = 0; while (right <= end) { if (cs[right] == '(') { score++; right++; } else if (cs[right] == ')') { score–; right++; } else if (cs[right] == ' ') { if (score == 0) break; right++; } else { right++; } } return right; }}

    • 時(shí)間復(fù)雜度:除對(duì)表達(dá)式進(jìn)行遞歸劃分以外,還存在對(duì) map 的每層拷貝操作,復(fù)雜度為 O(n2)O(n^2)O(n2)
    • 空間復(fù)雜度:O(n)O(n)O(n)

    最后

    這是我們「刷穿 LeetCode」系列文章的第 No.736 篇,系列開始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道題目,部分是有鎖題,我們將先把所有不帶鎖的題目刷完。

    在這個(gè)系列文章里面,除了講解解題思路以外,還會(huì)盡可能給出最為簡(jiǎn)潔的代碼。如果涉及通解還會(huì)相應(yīng)的代碼模板。

    為了方便各位同學(xué)能夠電腦上進(jìn)行調(diào)試和提交代碼,我建立了相關(guān)的倉(cāng)庫(kù):github.com/SharingSour… 。

    在倉(cāng)庫(kù)地址里,你可以看到系列文章的題解鏈接、系列文章的相應(yīng)代碼、LeetCode 原題鏈接和其他優(yōu)選題解。

    原文鏈接:https://juejin.cn/post/7117155612231729160

    鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
    用戶投稿
    上一篇 2022年7月8日 09:24
    下一篇 2022年7月8日 09:24

    相關(guān)推薦

    • 存儲(chǔ)過(guò)程語(yǔ)法(sql server存儲(chǔ)過(guò)程語(yǔ)法)

      今天小編給各位分享存儲(chǔ)過(guò)程語(yǔ)法的知識(shí),其中也會(huì)對(duì)sql server存儲(chǔ)過(guò)程語(yǔ)法進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開始吧! oracle存儲(chǔ)過(guò)程基本語(yǔ)法…

      2022年11月26日
    • 《寶可夢(mèng)朱紫》索財(cái)靈硬幣有什么用?索財(cái)靈硬幣作用及獲取

      寶可夢(mèng)朱紫寶可夢(mèng)索財(cái)靈是可以掉索財(cái)靈硬幣的,不少玩家不知道這個(gè)精靈掉落的硬幣有什么用,怎么獲取,小編這里給大家?guī)?lái)了寶可夢(mèng)朱紫索財(cái)靈硬幣作用及獲取,一起來(lái)看下文中具體介紹吧。 索財(cái)…

      2022年11月22日
    • 馬斯克凌晨一點(diǎn)半曬“代碼審查”現(xiàn)場(chǎng),編排他的段子比瘋狂星期四還多

      夢(mèng)晨 Pine 發(fā)自 凹非寺 量子位 | 公眾號(hào) QbitAI 每一個(gè)真正會(huì)寫代碼的人,請(qǐng)?jiān)谙挛?點(diǎn)到總部10層報(bào)到。 每一個(gè)真正會(huì)寫代碼的人,請(qǐng)?jiān)谙挛?點(diǎn)到總部10層報(bào)到。 馬斯…

      2022年11月21日
    • 有理數(shù)和無(wú)理數(shù)(有理數(shù)和無(wú)理數(shù)的區(qū)別)

      今天小編給各位分享有理數(shù)和無(wú)理數(shù)的知識(shí),其中也會(huì)對(duì)有理數(shù)和無(wú)理數(shù)的區(qū)別進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開始吧! 有理數(shù)和無(wú)理數(shù)是什么? 有理數(shù)指整數(shù)可…

      2022年11月21日
    • 什么是PID控制(pid是什么意思)

      (一)先來(lái)徹底搞懂PID到底是啥? 啥是PID? PID,就是“比例(proportional)、積分(integral)、微分(derivative)”,是一種很常見(jiàn)的控制算法?!?/p>

      2022年11月17日
    • 五金產(chǎn)品分類明細(xì)(五金都有什么)

      五金產(chǎn)品在我們家居裝修以及家具選購(gòu)的時(shí)候很是需要注意,因?yàn)槲褰甬a(chǎn)品很容易生銹,特別是埋在墻內(nèi)或者地下的,壞了就需要費(fèi)工夫去維修,所以需要好的五金產(chǎn)品,那么現(xiàn)在五金有哪些跟各有什么作…

      2022年11月14日
    • 加濕器的危害(加濕器的作用及好處)

      加濕器是北方小伙伴秋冬和換季必備的產(chǎn)品。雖然家庭普及率已經(jīng)很高了,但是仍然有小伙伴心里犯嘀咕,到底有用沒(méi)用?特別是隨著科技的發(fā)展,加濕器已經(jīng)由有霧的超聲波加濕器,發(fā)展到無(wú)霧的蒸發(fā)型…

      2022年11月14日
    • 網(wǎng)站客服代碼(網(wǎng)站客服代碼實(shí)現(xiàn)移動(dòng)端隱藏,電腦端展開)

      本文主要講的是網(wǎng)站客服代碼,以及和網(wǎng)站客服代碼實(shí)現(xiàn)移動(dòng)端隱藏,電腦端展開相關(guān)的知識(shí),如果覺(jué)得本文對(duì)您有所幫助,不要忘了將本文分享給朋友。 在線客服系統(tǒng)代碼是什么? 在線客服系統(tǒng)代碼…

      2022年11月12日
    • 8字頭股票什么意思(8字頭股票什么意思呀)

      北京證券交易所股票是以4和8開頭1北京證券交易所是以現(xiàn)有的新三板精選層為基礎(chǔ)組建,進(jìn)一步提升服務(wù)中小企業(yè)的能力,打造服務(wù)創(chuàng)新型中小企業(yè)主陣地北京證券交易所是因?yàn)槲覀儑?guó)家要支持中小企…

      2022年11月11日
    • 《戰(zhàn)神5》力量有什么用?力量作用介紹

      戰(zhàn)神5力量有什么用?在游戲當(dāng)中很多玩家還不清楚戰(zhàn)神5力量作用,不同的屬性有著不同的效果和內(nèi)容,很多玩家還不清楚具體的效果是什么,下面一起來(lái)看一下戰(zhàn)神5力量作用介紹。 戰(zhàn)神5力量作用…

      2022年11月9日

    聯(lián)系我們

    聯(lián)系郵箱:admin#wlmqw.com
    工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息