CodeSprout程式萌芽
困難第 376 題 · 批次結果與錯誤數
CodeSprout 官方2026/10/04 00:19
官方解答 · 置頂Java

官方解答|批次結果與錯誤數

官方解答|批次結果與錯誤數

解題思路

每 3 筆形成一批,包括最後不足的一批。每筆先 trim 解析,再驗證「偶數」,驗證錯拋受檢 ValidationException。批次復原規則:任一錯誤都只記錄而不停止;繼續處理完整批次。該批只要出現錯誤,提交總和就回滾為0。finally 每批記錄一次 close,最後輸出[第0批提交和, 第0批錯誤數, 第1批提交和, 第1批錯誤數, ...]。

正確性與邊界

成功筆數只計實際解析且通過驗證者;回滾只影響提交總和,不扣成功筆數。停止批次時未執行的資料不算錯誤。空 texts 不開資源、不產生批次,所有計數為 0。

複雜度

設總文字長度為 L、筆數為 n。時間 O(L+n),額外空間 O(n)。

公開範例

輸入 {"texts": ["bad"]},依上述步驟得到 [0, 1]。

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

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

import java.util.*;

public class Solution {
    private static class ValidationException extends Exception {}

    public static List<Integer> solve(String[] texts) {
        List<Integer> committed = new ArrayList<>(), totals = new ArrayList<>(), paired = new ArrayList<>();
        List<String> events = new ArrayList<>();
        int total=0, successes=0, errors=0, closed=0, batch=0;
        for (int start=0; start<texts.length; start+=3, batch++) {
            int batchSum=0, batchErrors=0;
            events.add("open:"+batch);
            try {
                for (int i=start; i<Math.min(start+3,texts.length); i++) {
                    try {
                        int x = Integer.parseInt(texts[i].trim(),10);
                        if (!(x % 2 == 0)) throw new ValidationException();
                        batchSum += x; successes++;
                        events.add("ok:"+x);
                    } catch (NumberFormatException | ValidationException error) {
                        batchErrors++; errors++;
                        events.add("error");
                        
                    }
                }
            } finally {
                closed++;
                events.add("close:"+batch);
            }
            if (batchErrors != 0) batchSum=0;
            committed.add(batchSum); paired.add(batchSum); paired.add(batchErrors);
            total += batchSum; totals.add(total);
        }
        return paired;
    }
}

留言討論 0