CodeSprout程式萌芽
困難第 65 題 · 算式正值統計
CodeSprout 官方2026/10/04 00:19
官方解答 · 置頂Java

官方解答|算式正值統計

官方解答|算式正值統計

解題思路

把每筆文字切為五欄,解析三個整數與兩個運算子。計算規則是「先乘後加減;相同優先級由左至右」,再套用 Math.abs(x)。最後回傳轉換後大於 0 的筆數,以單元素清單表示。

正確性與邊界

只有 +、-、*,分支完整覆蓋兩個運算子的所有組合。首尾及連續空格不影響切欄。空 records 的明細輸出為 [],統計輸出為 [0]。

複雜度

設總文字長度為 L,時間 O(L),額外空間 O(n) 存放結果。

公開範例

輸入 {"records": ["1 + 2 * 3"]},依上述步驟得到 [1]。

下方程式可直接取代起始碼;使用 Java 11,入口為 Solution.solve。

CodeSprout 官方解答 · 題意分析、解題步驟與完整參考程式

import java.util.*;

public class Solution {

    public static List<Integer> solve(String[] records) {
        List<Integer> result = new ArrayList<>();
        for (String record : records) {
            String[] parts = record.trim().split(" +");
            int a = Integer.parseInt(parts[0]);
            int b = Integer.parseInt(parts[2]);
            int c = Integer.parseInt(parts[4]);
            String left = parts[1], right = parts[3];
            int x;
            if (left.equals("*")) {
                int first = a*b;
                x = right.equals("*") ? first*c : right.equals("+") ? first+c : first-c;
            } else {
                int tail = right.equals("*") ? b*c : b;
                x = left.equals("+") ? a+tail : a-tail;
                if (!right.equals("*")) x = right.equals("+") ? x+c : x-c;
            }
            result.add(Math.abs(x));
        }
        int count=0;
        for (int x : result) if (x>0) count++;
        return Arrays.asList(count);
    }
}

留言討論 0