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
, 等等。
请注意,这可能不是计算字符的最佳方法,因为字符串可能包含的不仅仅是小写字母,例如大写字母和更多符号。
添加回答
举报