首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 程式設計題:讀取多組陣列去重排序後取第 k 大元素

     編輯:程式設計疑難解答

題目需求

輸入 n 組資料,每組先給 m(陣列長度),再給 m 個整數,最後給一個 k。對每組陣列去重、升序排序,輸出第 k 大元素(即索引 `length - k`)。

完整解法 (Java)

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] results = new int[n];

        for (int i = 0; i < n; i++) {
            int m = in.nextInt();
            int[] data = new int[m];
            int uniqueCount = 0;
            for (int j = 0; j < m; j++) {
                int val = in.nextInt();
                boolean exists = false;
                for (int k = 0; k < uniqueCount; k++) {
                    if (data[k] == val) { exists = true; break; }
                }
                if (!exists) data[uniqueCount++] = val;
            }
            // 只排序有效區間
            Arrays.sort(data, 0, uniqueCount);
            int k = in.nextInt();
            results[i] = data[uniqueCount - k];
        }

        for (int v : results) System.out.println(v);
    }
}

關鍵點

  1. 去重:因 m 可能較小,雙層迴圈 O(m²) 可接受;大資料量改用 `HashSet` 或排序後相鄰去重。
  2. 排序:`Arrays.sort(data, 0, uniqueCount)` 避免排序陣列尾部的預設 0 值。
  3. 第 k 大:升序排序後,索引 `uniqueCount - k` 即為第 k 大(k=1 為最大值)。

優化方向

  • 使用 `TreeSet` 自動去重+排序:`new TreeSet<>(Arrays.asList(...))`,但需注意基本型別裝箱開銷。
  • 若 k 遠小於 m,可用「快速選擇演算法」或「大小為 k 的最小堆」達到 O(m log k)。

結語

此題考察基本輸入處理、去重、排序、索引轉換。掌握 `Arrays.sort` 區間排序與索引計算,即可穩健解決。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved