java - 将char放入int数组是什么意思,是ASC号吗?
问题描述
class Solution {
public boolean isIsomorphic(String s, String t) {
int [] index_s = new int [128];//创建两个int数组128位,里面的值都为0
int [] index_t = new int [128];
for (int i =0; i<s.length(); i++){
char sc = s.charAt(i); //取每一个位置上的字符
char tc = t.charAt(i);
if (index_s[sc] != index_t[tc]){
return false ;
}else{
index_s[sc]=i+1;
index_t[tc]=i+1;
}
}
return true ;
}
}
从上面的代码来看,在int数组中,sc和tc都是char变量,那么这段代码是什么意思呢?
解决方案
tl;博士
您的代码计算两个输入字符串中第 n 个字符匹配的出现次数,共享相同的 US-ASCII 数字(Unicode 代码点编号)。计数保存在一个数组中,其中索引表示所有 128 个可能的 US-ASCII 代码数字 (0-127)。该代码使用了一种技巧,char
Java 中的类型实际上是一个 16 位整数。
您的代码适用String
于其值仅包含 US-ASCII 字符的输入对象。如果输入包含以 Unicode 定义的任何其他 143,731 个字符,则您的代码将失败。
细节
正如Haddad 评论的那样,您的线条片段:
index_s[sc]
index_t[tc]
... 使用变量sc
和tc
,两者的类型都char
好像它们是整数一样。这些整数值用作数组中从零开始的索引号以访问插槽。这是有效的,因为在 Java 中,char
类型被视为整数。有关这种特殊语言特性的讨论,请参阅Can the char type be categories to an integer? .
Unicode代码点编号(与前 128 位的US-ASCII编号相同,因为 Unicode 是 US-ASCII 的超集)是从每个char
. a
作为 a的字母char
实际上是一个 97 的十进制整数,其char
值为b
98,依此类推。
然后,您的代码继续增加int
该数组插槽中的值。原始类型的数组int
在每个槽中自动初始化为零。您的调用会=i+1
增加该插槽的编号,从 0 到 1,然后从 1 到 2,依此类推。代码中的这种递增是对我们在输入字符串中遇到该代码点编号的频率的计数。
US-ASCII 数字从零开始,范围为 0-127。Java 中的数组索引也是从零开始的。所以不需要调整。NUL
分配给 US-ASCII 数字的字符将0
计入使用索引访问的数组槽中0
。
你的代码:
if (index_s[sc] != index_t[tc]){
return false ;
...跳过两个输入字符串中的第 n 个字符是相同字符的情况,作为相同的代码点编号。
最后一行没有意义:return true ;
. 总是返回true
没有任何用处。
顺便说一句,该char
类型现在已经过时,甚至无法表示 Unicode 中定义的一半字符。相反,您应该学习仅直接使用 Unicode 代码点int
而不是char
.
推荐阅读
- excel - Excel VBA API 崩溃
- python - Keras 模型在训练期间有 2 个输入,但在推理期间只有 1 个输入
- office-js - 如何在 office.js Excel 加载项中显示更多六个自定义功能区命令
- python - 如何在多个索引上使用 python elasticseach 模块进行查询?
- node.js - 使用 AWS API Gateway 和 Lambda 从 S3 上传和检索图像
- php - 通过增加成本对 WooCommerce 运输选项进行排序,最后免费送货
- c# - 为类存储对象的有效方法是什么?
- java - 如何在 java jdbc 中设置图像的数据类型
- jaxb - JAXB 解组对象并添加原始 xml
- javascript - 如何通过ajax刷新highcharts(饼图)数据