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

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']++;什么?


慕勒3428872
浏览 387回答 2
2回答

qq_花开花谢_0

这段代码为字母表中的每个字母制作了一个类似直方图的计数器。尝试打印'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 {&nbsp; &nbsp; public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; String s = "snuffleupagus";&nbsp; &nbsp; &nbsp; &nbsp; int[] arr = new int[26];&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < s.length(); i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arr[s.charAt(i)-'a']++;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < arr.length; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println((char)(i + 'a') + ": " + arr[i]);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}输出:a: 1b: 0c: 0d: 0e: 1f: 2g: 1h: 0i: 0j: 0k: 0l: 1m: 0n: 1o: 0p: 1q: 0r: 0s: 2t: 0u: 3v: 0w: 0x: 0y: 0z: 0

梵蒂冈之花

arr由大小为 26 的 int 数组组成,这也是英文字母表中的字母数。这个循环所做的就是计算字母的频率,通过它们在字母表中的索引表示,arr[0]being&nbsp;'a',arr[1]being'b'等。它的技术细节可以简单地解释。s.charAt(i)正在返回char指定位置的实例i。char在 Java 中,A也可以表示为一个字节。减法然后byte从当前字符中获取 'a'的 ASCII 值(表示为 a&nbsp;)i。所以你最终得到的是'a' - 'a' == 0,&nbsp;'b' - 'a' == 1, 等等。请注意,这可能不是计算字符的最佳方法,因为字符串可能包含的不仅仅是小写字母,例如大写字母和更多符号。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java