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

本篇推文共計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() 方法檢測字符串中是否包含子字符串 str ,
如果指定 beg(開始) 和 end(結束) 范圍,則
檢查是否包含在指定范圍內,
如果包含子字符串返回開始的索引值,否則返回-1
str.find(str, beg=0, end=len(string))
? str -- 指定檢索的字符串
? beg -- 開始索引,默認為0。
? end -- 結束索引,默認為字符串的長度。
判斷左右小括號的位置,優(yōu)先計算小括號里面的表達式子數值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】套信封問題
你與世界
只差一個
公眾號
評論
圖片
表情

