leetcode 227 基本計算器II

2021-10-01 23:10:45 字數 1918 閱讀 5519

實現乙個基本的計算器來計算乙個簡單的字串表示式的值。

字串表示式僅包含非負整數,+, - ,*,/ 四種運算子和空格 。 整數除法僅保留整數部分。

示例 1:

輸入: "3+2*2"

輸出: 7

示例 2:

輸入: " 3/2 "

輸出: 1

示例 3:

輸入: " 3+5 / 2 "

輸出: 5

說明:

(1)你可以假設所給定的表示式都是有效的。

(2)請不要使用內建的庫函式 eval。

參見leetcode 224的解法,首先將中綴表示式轉化為字尾表示式,再計算字尾表示式的值。當然這樣的時間耗費和空間耗費都是挺大的。優點是通用。

class

solution

;public

:int

calculate

(string s)

intevalrpn

(vector

& tokens)

for(

int i=

0;i)else

}return s1.

top();

} vector

mid2post

(string s)

else

s2.push

(tostring

(s[i]))

;//當前符號入棧}}

else

if(s[i]

==')'

) s2.

pop();

//"("

}else

}while

(!s2.

empty()

)return res;

}int

getorder

(char s)

string tostring

(char ch)

};

class

solution

else

if(s[i]

=='*'

|| s[i]

=='/'

)else

}while

(!s2.

empty()

)calc()

;return s1.

top();

}int

getvalue

(int num1,

int num2 ,

char ch)

void

calc()

};

上面兩種解法的時間耗費和空間耗費都比較高,分析一下開銷主要在以下方面:

(1)棧的操作:stl庫本來就慢;

(2)string.substr(int start,int len),stoi(string s)

(3)函式的呼叫;

乙個時間和空間相對較優的實現如下:

class

solution

if(c ==

'+'|| c ==

'-'|| c ==

'*'|| c ==

'/'|| i == n -1)

if(c ==

'+'|| c ==

'-'|| i == n -1)

op = c;

num =0;

}}return res;}}

;

(1)for迴圈中盡量避免改變迴圈變數的值,一般都有辦法乙個乙個讀,使用變數記錄即可。(如本題找乙個完整的數,可以用乙個int變數記錄)

(2)為了時空間耗費最優,少呼叫花裡胡哨的函式。

leetcode 227基本計算器II

實現乙個基本的計算器來計算乙個簡單的字串表示式的值。字串表示式僅包含非負整數,四種運算子和空格 整數除法僅保留整數部分。示例 1 輸入 3 2 2 輸出 7 示例 2 輸入 3 2 輸出 1 示例 3 輸入 3 5 2 輸出 5 說明 你可以假設所給定的表示式都是有效的。請不要使用內建的庫函式 ev...

LeetCode227 基本計算器II

感覺自己的思路還不錯,比較簡單清晰,量也比較少,沒有用到記錄運算子的變數或棧,就想把這個思路發一下部落格。題目 實現乙個基本的計算器來計算乙個簡單的字串表示式的值。字串表示式僅包含非負整數,四種運算子和空格 整數除法僅保留整數部分。思路 使用乙個棧用於暫存得不到計算的數字 無法確定優先順序,比如當前...

leetcode 227 基本計算器 II

實現乙個基本的計算器來計算乙個簡單的字串表示式的值。字串表示式僅包含非負整數,四種運算子和空格 整數除法僅保留整數部分。示例 1 輸入 3 2 2 輸出 7 示例 2 輸入 3 2 輸出 1 示例 3 輸入 3 5 2 輸出 5 說明 你可以假設所給定的表示式都是有效的。請不要使用內建的庫函式 ev...