去看紀錄,我這題寫了三天終於寫出來了。我大概是在這題重新上傳次數最多的人,笑死。
致跟我一樣不知道自己程式問題在哪而煩惱的你/妳:在繼續讀下去前,我會建議你/妳先自己試過幾輪、細心思考所有可能會出錯的地方並盡力修正,因為那才是這些題目的意義。
但如果你/妳已經被這題困擾到有壓力的話,那就繼續讀下去吧。
對了,因為我三天前才開始碰Java,所以不保證以下完全正確。
1. 括號
括號可能會以所有符合規定的方式出現在隱藏題目裡,包括多組括號並排、重疊以或兩者皆有。範例如下:
並排:1 + ( 2 - 3 ) + (4 - 5 ) + 6
重疊:1 + ( 2 - ( 3 + 4 ) + 5 ) + 6
皆有:1 + ( ( 2 - 3 ) + ( 4 + 5 ) ) + 6
我的作法是用一個迴圈不斷尋找並更新左括號的索引值,一直到碰上第一個右括號時,就代表兩者之間只剩數字與計算符號,這樣我們就有了目前優先度最高的子字串索引值了。
我會建議在此使用「遞迴」來處理各種子字串。
還有,我不確定括號會不會有無空格相連的情況,如果擔心的話就用簡單的取代功能處理吧。
2. 計算順序
如果你/妳跟我一樣以為計算順序是「乘 > 除 > 餘 > 加 > 減」的話,那就錯了!正確的計算順序是「乘除餘 > 加減」,如果順位一樣則以最左優先,範例如下:
1 % 2 / 3 * 4 -> 最優先計算:「1 % 2」
1 - 2 + 3 - 4 -> 最優先計算「1 - 2」
1 - 2 + 3 / 4 * 5 -> 最優先計算「3 / 4」
3. 字元的不當使用可能會不小心用到「正則表達式」
在處理括號或計算符號時,如果不確定自己的寫法會不會動到正則表達式的話,我會建議用UNICODE最保險且不麻煩。
4. 負數可能會出現在計算過程中
題目給的數字不會有負數,但負數可能會出現在計算過程中。對此我會建議首先把所有字元以最保險又不會將多位數數字意外分開的方式處理字串。
例如確保每次處理字串時,都能將每個數字與計算符號以單空格分開,並以「字串.split(" ")」分開處理數字與計算符號,或者其他我沒想到的處理方式。
1. 括號間距固定、括號位置種類、括號內含大於兩個數字、計算順序、計算過程包含負數
輸入:( 8 % 2 * ( 3 + 2 + 1 ) / ( 2 * 2 ) ) - 6 - 3 + 4 - ( 1 - ( 50 * 2 ) ) + 6
輸出:100
最後,我會建議程式出問題時,可以透過輸出文字的方式追蹤計算進度,並確認所有資料型態是否正確或可能會卡到其他資料。