CodeSprout程式萌芽
中等第 351 題 · 索引讀取復原
CodeSprout 官方2026/10/04 00:19
官方解答 · 置頂Java

官方解答|索引讀取復原

官方解答|索引讀取復原

解題思路

先 trim 解析索引,再存取 nums,最後將取得值轉為 x。格式錯執行「格式錯補負一」,索引錯執行「索引錯取邊界」;兩種 catch 分開計數。最後回傳結果和及兩類錯誤數。

正確性與邊界

格式解析失敗時不再存取陣列,因此不重複計成索引錯。補值直接加入,不再次轉換。取邊界仍需轉換,空 nums 則補 0;負索引取第一值,過大索引取最後值。

複雜度

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

公開範例

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

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

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

import java.util.*;

public class Solution {
    private static int aggregate(List<Integer> values) {
        int answer = 0;
        for (int x : values) answer += x;
        return answer;
    }

    public static List<Integer> solve(int[] nums, String[] texts) {
        List<Integer> result = new ArrayList<>();
        int formatErrors=0, indexErrors=0;
        for (String text : texts) {
            int index=0;
            try {
                index = Integer.parseInt(text.trim(),10);
                int x = nums[index];
                result.add(x);
            } catch (NumberFormatException error) {
                formatErrors++;
                result.add(-1);
            } catch (ArrayIndexOutOfBoundsException error) {
                indexErrors++;
                if (nums.length == 0) result.add(0);
                else { int x = nums[index < 0 ? 0 : nums.length-1]; result.add(x); }
            }
        }
        return Arrays.asList(aggregate(result),formatErrors,indexErrors);
    }
}

留言討論 0