CodeSprout程式萌芽
中等第 426 題 · 展場標籤排序
CodeSprout 官方2026/10/04 00:19
官方解答 · 置頂Java

官方解答|展場標籤排序

官方解答|展場標籤排序

解題思路

先執行「先以 Locale.ROOT 將全部字串轉小寫,再對轉換結果去重,只保留第一次」,再用小寫首字元作主鍵,依遞減比較。主鍵同分時保留前處理後的原順序,使用穩定排序。List.sort 使用穩定排序,回傳 0 時保留前處理後順序。

正確性與邊界

排序發生在前處理之後。字母、數字及母音只按題目的 ASCII 範圍計數;空字串首字元鍵為 -1。去重保留第一次,其他前處理則保留重複。

複雜度

設 n 為字串數、L 為最長字串長度。最壞時間 O(n log n · L),額外空間 O(nL+n),包括保留的小寫字串。

公開範例

輸入 {"words": ["Java"]},依上述步驟得到 ["java"]。

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

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

import java.util.*;

public class Solution {
    private static int key(String word) {
        return word.isEmpty() ? -1 : Character.toLowerCase(word.charAt(0));
    }

    public static List<String> solve(String[] words) {
        List<String> result = new ArrayList<>();
        Set<String> seen = new HashSet<>();
        for (String word : words) {
            String lower = word.toLowerCase(Locale.ROOT);
            if (seen.add(lower)) result.add(lower);
        }
        result.sort((a,b) -> {
            int order = Integer.compare(key(b),key(a));
            return order != 0 ? order : 0;
        });
        return result;
    }
}

留言討論 0