国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價(jià)值的文章主要介紹了736. Lisp 語(yǔ)法解析 : DFS 模擬題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

題目描述

這是 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ù)、 )
  • let 表達(dá)式采用? "(let v1 e1 v2 e2 ... vn en expr)" 的形式,其中? let 總是以字符串? "let"來表示,接下來會(huì)跟隨一對(duì)或多對(duì)交替的變量和表達(dá)式,也就是說,第一個(gè)變量? v1被分配為表達(dá)式? e1?的值,第二個(gè)變量? v2?被分配為表達(dá)式? e2?的值,依次類推;最終 let 表達(dá)式的值為? expr 表達(dá)式的值。
  • add 表達(dá)式表示為? "(add e1 e2)" ,其中? add 總是以字符串? "add" 來表示,該表達(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á)式的值之 積 。
  • 在該題目中,變量名以小寫字符開始,之后跟隨 個(gè)或多個(gè)小寫字符或數(shù)字。為了方便, "add""let" , "mult" 會(huì)被定義為 `"關(guān)鍵字" ,不會(huì)用作變量名。
  • 最后,要說一下作用域的概念。計(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 值時(shí), 在變量的上下文中由最內(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?。

提示:

  • 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<String, Integer> map) 函數(shù),代表計(jì)算 的結(jié)果,答案為 dfs(0,n-1,map),其中 為字符串的長(zhǎng)度。

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

  • ,說明是表達(dá)式,此時(shí)從 開始往后取,取到空格為止(假設(shè)位置為 idx),從而得到操作 op(其中 oplet、addmult 三者之一),此時(shí) op 對(duì)應(yīng)參數(shù)為 ,也就是需要跳過位置 (即跳過 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ā),一直往右找(不超過 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
  • 否則 不是表達(dá)式,通過判斷 是否有被哈希表記錄來得知結(jié)果:若在哈希表中有記錄,結(jié)果為哈希表中的映射值,否則結(jié)果為本身所代表的數(shù)值。

需要注意,根據(jù)「作用域」的定義,我們不能使用全局哈希表,而要在每一層遞歸時(shí),傳入 clone 出來的 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<String,?Integer>?map)?{
????????if?(cs[l]?==?'(')?{
????????????int?idx?=?l;
????????????while?(cs[idx]?!=?'?')?idx++;
????????????String?op?=?s.substring(l?+?1,?idx);
????????????r--;?//?判別為?"(let"、"(add"?或?"(mult"?后,跳過對(duì)應(yīng)的?")"
????????????if?(op.equals("let"))?{
????????????????for?(int?i?=?idx?+?1;?i?<=?r;?)?{
????????????????????int?j?=?getRight(i,?r);
????????????????????String?key?=?s.substring(i,?j);
????????????????????if?(j?>=?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ù)雜度為
  • 空間復(fù)雜度:

最后

這是我們「刷穿 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ù):https://github.com/SharingSource/LogicStack-LeetCode 。

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

更多更全更熱門的「筆試/面試」相關(guān)資料可訪問排版精美的 合集新基地 ????

本文由 mdnice 多平臺(tái)發(fā)布文章來源地址http://www.zghlxwxcb.cn/news/detail-438813.html

到了這里,關(guān)于736. Lisp 語(yǔ)法解析 : DFS 模擬題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • hw大一Python模擬題詳解

    hw大一Python模擬題詳解

    一、選擇題 1、關(guān)于Python語(yǔ)言的特點(diǎn),以下選項(xiàng)描述正確的是( B )。 A.Python語(yǔ)言不支持面向?qū)ο蟆??????????? B.Python語(yǔ)言是解釋型語(yǔ)言。 C.Python語(yǔ)言是編譯型語(yǔ)言。????????????? D.Python語(yǔ)言是非跨平臺(tái)語(yǔ)言。 解析: Python 是一種解釋型、面向?qū)ο?、?dòng)態(tài)數(shù)據(jù)類型

    2024年01月16日
    瀏覽(21)
  • 藍(lán)橋杯嵌入式--實(shí)戰(zhàn)模擬題

    藍(lán)橋杯嵌入式--實(shí)戰(zhàn)模擬題

    在藍(lán)橋杯省賽舉辦之前,學(xué)校組織了一場(chǎng)模擬賽,基于第十三屆的省賽題,但是難度略高于省賽,這篇博客記錄一下解題的過程,其思路可供大家參考。 詳細(xì)工程目前先聯(lián)系我獲取。 花個(gè)十幾分鐘把題目好好理解一下,然后先整理出一個(gè)大體的運(yùn)行原理。很容易我們就想到

    2023年04月10日
    瀏覽(36)
  • 軟考高項(xiàng):信息網(wǎng)絡(luò)安全模擬題

    280、在TCP/IP的體系架構(gòu)中,ARP協(xié)議位于(),它的作用是()。 A.網(wǎng)絡(luò)層將MAC地址解析為IP地址 B.鏈路層將MAC地址解析為IP地址 C.網(wǎng)絡(luò)層將IP地址解析為MAC地址 D.鏈路層將lP地址解析為MAC地址 正確答案:D 解析:在TCP/IP的體系架構(gòu)中,ARP協(xié)議位于鏈路層,它的作用是將IP地址解析為MAC地址

    2024年02月13日
    瀏覽(26)
  • Vj程序設(shè)計(jì)復(fù)雜模擬題訓(xùn)練

    飛飛很喜歡打牌,他決定苦練牌技,終成賭神! 飛飛有? A ?×? B ?張撲克牌。每張撲克牌有一個(gè)大小(整數(shù),記為 a,范圍區(qū)間是?0?到? A ?-?1)和一個(gè)花色(整數(shù),記為 b,范圍區(qū)間是?0?到? B ?-?1。 撲克牌是互異的,也就是獨(dú)一無二的,也就是說沒有兩張牌大小和花

    2023年04月19日
    瀏覽(21)
  • csp-j/s模擬題詳細(xì)題解

    題目描述 一天小理買了N個(gè)容量可以認(rèn)為是無限大的瓶子,開始時(shí)每個(gè)瓶子里有1升水。接著小理發(fā)現(xiàn)瓶子實(shí)在太多了,于是他決定保留不超過K個(gè)瓶子,每次他選擇兩個(gè)當(dāng)前含水量相同的瓶子合并。(即把一個(gè)瓶子的水全部倒進(jìn)另一個(gè)里然后把空瓶丟棄) (注:不能丟棄有水

    2024年02月10日
    瀏覽(24)
  • 軟考高項(xiàng):信息網(wǎng)絡(luò)安全知識(shí)模擬題

    620、以下哪個(gè)場(chǎng)景屬于身份鑒別過程()。 A.用戶依照提示輸入用戶名、口令和短信驗(yàn)證碼,成功登錄該應(yīng)用。 B.用戶在網(wǎng)絡(luò)上共享了的一份加密的pdf文檔,以阻止其他人下載查看文檔中的內(nèi)容。 C.用戶給自己編寫的文檔加上水印。 D.用戶在網(wǎng)上下載了一份帶水印的文檔,去掉

    2024年02月05日
    瀏覽(21)
  • 國(guó)家信息安全水平考試NISP一級(jí)模擬題

    1. ? 下列關(guān)于用戶口令說法錯(cuò)誤的是 ( ? ) 。 A. ? 口令不能設(shè)置為空 B. ? 口令長(zhǎng)度越長(zhǎng), ? 安全性越高 C. ? 復(fù)雜口令安全性足夠高,不需要定期修改 D. ? 口令認(rèn)證是最常見的認(rèn)證機(jī)制 正確答案: ? C 2. ? 下列關(guān)于木馬病毒的特性, ? 不正確的是 ( ? ) 。 A. ? 隱蔽

    2023年04月08日
    瀏覽(19)
  • 網(wǎng)絡(luò)安全模擬題----軟考高項(xiàng)的走過來

    1、某公司技術(shù)人員利于自己的技術(shù)入侵了某電商數(shù)據(jù)庫(kù),將其中的用戶數(shù)據(jù)下載后在暗網(wǎng)中進(jìn)行售賣,該行為的處置最適用的是以下那部法律?(??) A.刑法????B.網(wǎng)絡(luò)安全法?????C.電子簽名法?????D.勞動(dòng)法 正確答案:A?????解析:入侵他人網(wǎng)站,角觸犯的是刑法,不屬于

    2024年02月10日
    瀏覽(20)
  • 藍(lán)橋杯web開發(fā)-5道模擬題讓你信心滿滿

    藍(lán)橋杯web開發(fā)-5道模擬題讓你信心滿滿

    ?? 作者簡(jiǎn)介:大家好,我是阿牛,全棧領(lǐng)域新星創(chuàng)作者。?? ?? 個(gè)人主頁(yè):館主阿牛?? ?? 支持我:點(diǎn)贊??+收藏??+留言?? ?? 系列專欄:硬泡 javascript?? ??格言:迄今所有人生都大寫著失敗,但不妨礙我繼續(xù)向前!?? 前些天發(fā)現(xiàn)了一個(gè)比較好的人工智能學(xué)習(xí)網(wǎng)站,

    2023年04月09日
    瀏覽(45)
  • 信息網(wǎng)絡(luò)安全模擬題----軟考高項(xiàng)的走過來

    101、通過“計(jì)算機(jī)管理”來清除時(shí)間日志也可以達(dá)到清除痕跡的目的,具體操作是() A.禁用“event system”服務(wù)????????B.禁用“net logon”服務(wù) C.禁用“event log”服務(wù)??????D.禁用“secondary logon”服務(wù) 正確答案:C?????解析:通過“計(jì)算機(jī)管理”來清除時(shí)間日志也可以達(dá)到清

    2024年02月08日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包