我正在编程研讨会类(class)中研究 Kattis 问题“abc”。该问题要求您输入 0 到 100 之间的三个 int,并让它们与另一组三个 char 输入的模式匹配,大小写为:A < B < C。这里 'A' 将是具有最小值的 int,'B'将是第二大值,等等。我确定了我的逻辑,但不确定如何将值与字符匹配。然后一位同学给了我最后一行的帮助,但我没有机会询问它是如何工作的。我的代码如下:
public class ABC {
public static void main(String[] args) {
var scanner = new Scanner(System.in);
int[] num = new int[3];
for (int i=0; i<num.length; i++) {
num[i] = scanner.nextInt();
}
Arrays.sort(num);
char[] chArr = scanner.next().toCharArray();
for (int i=0; i<chArr.length; i++) {
System.out.println(num[chArr[i] - 'A']); //How does num[chArr[i] - 'A'] work?
}
}
}
输入:
1 2 3
C A B
输出:
3 1 2
所以,我的问题是:最后 println 中的表达式如何工作?我是一个在 SO 上发帖的菜鸟,所以任何建议将不胜感激。
最佳答案
一个char
在 C 中实际上只是一个 8 位整数。它通常用于表示 ASCII 字符,但在代码中它是一个整数。或者换句话说,char
和uint8
本质上是相同的类型(事实上,在大多数实现中,一个是另一个的别名)。
这种关系以某种形式持续存在于 Java 中。一个char
本质上是一个将自身呈现为字符的整数。因此,您可以对字符进行整数运算。
检查num[chArr[i] - 'A']
:
-
chArr[i]
检索索引i
处的字符的chArr
,char
的数组s。假设这是'C'
。 - 请注意
'C'
的 ASCII 值是 67。 - 请注意
'A'
的 ASCII 值是 65。 - 67 - 65 = 2。所以,
'C'
是字母表中的第三个字母,这意味着它对应于num
的索引 2 . - 检索
num
索引 2 处的值,然后打印。
关于Java int数组和char数组实现: why does this work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60106066/