2 回答

TA貢獻1835條經驗 獲得超7個贊
這段代碼為字母表中的每個字母制作了一個類似直方圖的計數器。嘗試打印'a'如下字符:
System.out.println((int)'a'); // Output: 97
每個char都有一個對應的 Unicode 值,介于 0 和 65,535 之間。減去'a'(或,97)將字母表中的每個字母縮放到與arr數組中的“桶”相對應的 0-26 范圍。下面是一個例子:
System.out.println('z' - 'a'); // Output: 25 (the last bucket in the array)
System.out.println('a' - 'a'); // Output: 0 (the first bucket in the array)
代碼中的第二個循環檢查每個計數的奇偶校驗以確定哪些是奇數。最后,最后的打印條件檢查字母總數是否出現奇數。如果這個總數0或它本身是奇數,則打印"First",否則"Second"。
使用ato之外的任何字符z或大寫字母嘗試使用此代碼。它會崩潰,因為字符的 ASCII 表示超出了數組的大小,你會得到一個IndexOutOfBoundsException.
這是一個示例程序,顯示了如何構建直方圖并通過加法將其輸出轉換回字母:
class Main {
public static void main(String[] args) {
String s = "snuffleupagus";
int[] arr = new int[26];
for (int i = 0; i < s.length(); i++) {
arr[s.charAt(i)-'a']++;
}
for (int i = 0; i < arr.length; i++) {
System.out.println((char)(i + 'a') + ": " + arr[i]);
}
}
}
輸出:
a: 1
b: 0
c: 0
d: 0
e: 1
f: 2
g: 1
h: 0
i: 0
j: 0
k: 0
l: 1
m: 0
n: 1
o: 0
p: 1
q: 0
r: 0
s: 2
t: 0
u: 3
v: 0
w: 0
x: 0
y: 0
z: 0

TA貢獻1900條經驗 獲得超5個贊
arr
由大小為 26 的 int 數組組成,這也是英文字母表中的字母數。這個循環所做的就是計算字母的頻率,通過它們在字母表中的索引表示,arr[0]
being 'a'
,arr[1]
being'b'
等。
它的技術細節可以簡單地解釋。s.charAt(i)
正在返回char
指定位置的實例i
。char
在 Java 中,A也可以表示為一個字節。減法然后byte
從當前字符中獲取 'a'的 ASCII 值(表示為 a )i
。所以你最終得到的是'a' - 'a' == 0
, 'b' - 'a' == 1
, 等等。
請注意,這可能不是計算字符的最佳方法,因為字符串可能包含的不僅僅是小寫字母,例如大寫字母和更多符號。
添加回答
舉報