为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我们在java中使用string.charAt(index)-'a'?

为什么我们在java中使用string.charAt(index)-'a'?

慕勒3428872 2021-08-25 10:18:01
public static void main(String[] args) throws IOException {    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));    String s = br.readLine();    int[] arr = new int[26];    for(int i=0;i<s.length();i++)        arr[s.charAt(i)-'a']++;        int odds = 0;    for(int i=0;i<26;i++)        if(arr[i]%2!=0)            odds++;        if(odds%2==1 || odds==0)        System.out.println("First");    else        System.out.println("Second");}我看到了这段代码,发现这部分令人困惑。所以你能告诉我为什么我们要使用这个以及'a'in 的意义是arr[s.charAt(i)-'a']++;什么?
查看完整描述

2 回答

?
qq_花开花谢_0

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


查看完整回答
反对 回复 2021-08-25
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

arr由大小为 26 的 int 数组组成,这也是英文字母表中的字母数。这个循环所做的就是计算字母的频率,通过它们在字母表中的索引表示,arr[0]being 'a'arr[1]being'b'等。

它的技术细节可以简单地解释。s.charAt(i)正在返回char指定位置的实例ichar在 Java 中,A也可以表示为一个字节。减法然后byte从当前字符中获取 'a'的 ASCII 值(表示为 a )i。所以你最终得到的是'a' - 'a' == 0'b' - 'a' == 1, 等等。

请注意,这可能不是计算字符的最佳方法,因为字符串可能包含的不仅仅是小写字母,例如大写字母和更多符号。


查看完整回答
反对 回复 2021-08-25
  • 2 回答
  • 0 关注
  • 386 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信