<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【一天一道Leetcode】基本計算器

          共 2559字,需瀏覽 6分鐘

           ·

          2021-03-14 18:35


          本篇推文共計2000個字,閱讀時間約3分鐘。



          01


          題目描述


          題目描述:


          實現一個基本的計算器來計算一個簡單的字符串表達式s的值。


          示例:

          輸入:s = "1 + 1"
          輸出:2
          輸入:s = " 2-1 + 2 "
          輸出:3
          輸入:s = "(1+(4+5+2)-3)+(6+8)"
          輸出:23


          提示:

          1. 1 <= s.length <= 3 * 10^5

          2. s 由數字、'+'、'-'、'('、')'、和 ' ' 組成

          3. s 表示一個有效的表達式




          02


          方法和思路


          由題目可知,

          本題需要注意的要點有兩個


          1.由題目可知只有“+”,“-”運算,沒有“*”,“/”運算,因此少了不同運算符優(yōu)先級的比較,可以從左到右計算。


          2.題目中會遇到小括號的情況,應該首先算出括號里面的表達式。





          根據分析,我覺得可以用eval函數來解答本題:

          eval() 函數用來執(zhí)行一個字符串表達式,并返回表達式的值。
          eval(expression[, globals[, locals]])

          expression -- 表達式。
          globals -- 變量作用域,全局命名空間,如果被提供,則必須是一個字典對象。
          locals -- 變量作用域,局部命名空間,如果被提供,可以是任何映射對象。


          一個關于的eval()函數的例子如下所示:

          x = 7 
          eval( '5 * x' )
          輸出:35

          eval('2 + 2')
          輸出:4






          因為字符串中可能會含"("")"

          如果直接使用eval()計算的話

          leetcode系統(tǒng)會出現報錯

          如下所示:


          但是用自己電腦運行的話,不會出錯:

          電腦本地跑試含有"("")"的字符串表達式:

          s="(1+(4+5+2)-3)+(6+8)"
          print(eval(s))

          輸出為:23


          所以為了讓代碼可以在leetcode系統(tǒng)中運行,

          我們可以由內而外地分批次使用eval()計算式


          這里我們使用rfind()find()來解決。





          關于rfind()的介紹如下:

          rfind() 返回字符串最后一次出現的位置,如果沒有匹配項則返回 -1。
          用法如下:
          str.rfind(str, beg=0 end=len(string))
          ? str -- 查找的字符串
          ? beg -- 開始查找的位置,默認為 0
          ? end -- 結束查找位置,默認為字符串的長度。


          rfind()舉例用法如下:

          s="(1+(4+5+2)-3)"
          a=s.rfind('(')
          print("最后一次出現'('的字符串位數是:",a)

          輸出為
          最后一次出現'('的位數是:3





          關于find()的介紹如下:
          find() 方法檢測字符串中是否包含子字符串 str ,
          如果指定 beg(開始) 和 end(結束) 范圍,則
          檢查是否包含在指定范圍內,
          如果包含子字符串返回開始的索引值,否則返回-1

          str.find(str, beg=0, end=len(string))
          ? str -- 指定檢索的字符串
          ? beg -- 開始索引,默認為0。
          ? end -- 結束索引,默認為字符串的長度。
          判斷左右小括號的位置,優(yōu)先計算小括號里面的表達式子數值


          find()舉例用法如下:
          s="(1+(4+5+2)-3)"
          a=s.rfind('(')
          b=s.find(')',a)
          print("最后一次出現'('的字符串位數是:",a)
          print("從第2個'('開始的最近一個')'的位置是",b)

          輸出為:
          最后一次出現'('的字符串位數是:3
          從第2'('開始的最近一個')'的位置是 9






          使用rfind()find()的緣由是,

          優(yōu)先計算好了小括號里面的數值后,

          將其轉換為字符串的形式

          方便可以再次使用eval()函數

          如以下所示:

          str(eval(s[a:b+1]))






          我們用代碼表示如下:

          class Solution:
              def calculate(self, s: str) -> int:
                  while True:
                      a=s.rfind('(')
                      b=s.find(')',a)
                      if a==-1:
                          break
                      s=s[:a]+str(eval(s[a:b+1]))+s[b+1:]
                  return eval(s)




          往期回顧

          【年終總結】你好2021,再見2020。


          【快速寫好畢業(yè)論文】你不得不知曉的七個常用文獻搜索平臺


          【秋招紀實錄】一篇特別正經的【騰訊】求職經驗分享


          【一天一道Leetcode】回文字符串-最少分割次數


          【一天一道Leetcode】用棧實現隊列


          【一天一道Leetcode】套信封問題



          ☆ END ☆

          你與世界

          只差一個

          公眾號

          瀏覽 66
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  牛牛高清无码在线观看视频 | 久久精品91AV视频 | 在线日韩| 91人妻日韩人妻无码专区精品 | 日本在线视频一区二区 |