public static int[] countLetters(char[] chars) {
int[] counts = new int[26]; // 26 個英文字母計數器
for (int i = 0; i < chars.length; i++) {
counts[chars[i] - 'a']++; // 核心邏輯
}
return counts;
}
計算機中字符本質是整數(ASCII/Unicode 碼)。小寫字母連續分佈:
'a' = 97, 'b' = 98, 'c' = 99 ... 'z' = 122
| 字符 chars[i] | ASCII 值 | chars[i] - 'a' | 數組索引 |
|---|---|---|---|
| 'a' | 97 | 97 - 97 = 0 | counts[0] (存 'a' 個數) |
| 'b' | 98 | 98 - 97 = 1 | counts[1] (存 'b' 個數) |
| 'c' | 99 | 99 - 97 = 2 | counts[2] (存 'c' 個數) |
| ... | ... | ... | ... |
| 'z' | 122 | 122 - 97 = 25 | counts[25] (存 'z' 個數) |
輸入字符數組: ['b', 'a', 'c', 'a', 'b']
初始 counts: [0, 0, 0, ..., 0] (長度 26)
i=0, char='b' (98) -> 索引 1 -> counts[1]++ -> [0, 1, 0, ...]
i=1, char='a' (97) -> 索引 0 -> counts[0]++ -> [1, 1, 0, ...]
i=2, char='c' (99) -> 索引 2 -> counts[2]++ -> [1, 1, 1, ...]
i=3, char='a' (97) -> 索引 0 -> counts[0]++ -> [2, 1, 1, ...]
i=4, char='b' (98) -> 索引 1 -> counts[1]++ -> [2, 2, 1, ...]
最終結果: a:2, b:2, c:1, 其他:0
char c = chars[i];
if (c >= 'a' && c <= 'z') {
counts[c - 'a']++;
}
char lower = Character.toLowerCase(chars[i]);
if (lower >= 'a' && lower <= 'z') {
counts[lower - 'a']++;
}
chars[i] - 'a' 巧妙利用字符編碼連續性,將字符直接映射為 0-25 索引,實現 O(1) 計數,是字符統計、詞頻分析、字母異位詞判斷等算法的經典技巧。