首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 字符統計與去重反序:高效位圖法實現字符頻次分析

     編輯:Java 相關知識

核心需求

  • 統計字符串中每個字符出現次數
  • 輸出逆序且去重的字符列表及其頻次

算法設計:定長位圖 + 逆序遍歷

public class CharStat {
    public static void main(String[] args) {
        String src = "A B C D E B C";
        src = src.replaceAll("\\s+", "");  // 移除空白

        // 1. 逆序字符數組
        char[] cs = src.toCharArray();
        for (int i = 0, j = cs.length - 1; i < j; i++, j--) {
            char tmp = cs[i]; cs[i] = cs[j]; cs[j] = tmp;
        }

        // 2. 位圖統計 + 去重收集
        int[] freq = new int[256];  // ASCII 範圍足夠
        List<Character> uniq = new ArrayList<>();

        for (char c : cs) {
            if (freq[c] == 0) uniq.add(c);  // 首次遇見 → 記錄順序
            freq[c]++;
        }

        // 3. 輸出
        for (char c : uniq) {
            System.out.printf("%c : %d 次%n", c, freq[c]);
        }
    }
}

輸出示例

C : 2 次
B : 2 次
E : 1 次
D : 1 次
A : 1 次

擴展:高效判斷字符集交集

需求:檢查字符串 a 中是否包含字符串 b 的任意字符。

public static void findCommonChars(String a, String b) {
    boolean[] bitmap = new boolean[256];
    for (char c : b.toCharArray()) bitmap[c] = true;

    for (char c : a.toCharArray()) {
        if (bitmap[c]) System.out.println("共同字符: " + c);
    }
}

複雜度: O(n+m) 時間,O(1) 空間(固定 256/65536 陣列)。

進階優化方向

  • Unicode 全字符集 → 改用 BitSet 或 int[] 分段位圖
  • 極長文本 → 流式處理 + 概率數據結構(Bloom Filter)
  • 並行統計 → ForkJoin 分段統計再合併頻次陣列
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved